From 6ae1145b0a7b10c063e2929150dcce9af246e60e Mon Sep 17 00:00:00 2001 From: "cl349@firebug.cl.cam.ac.uk" Date: Wed, 6 Apr 2005 08:37:09 +0000 Subject: [PATCH] bitkeeper revision 1.1236.60.1 (42539fb5RDSrpMSePpTfUbKsp5hWqQ) X86_64 fixes. From: "Nakajima, Jun" Signed-off-by: Christian Limpach --- .rootkeys | 2 +- linux-2.6.11-xen-sparse/arch/xen/Kconfig | 12 +- .../arch/xen/configs/xen0_defconfig_x86_32 | 8 +- .../arch/xen/configs/xen0_defconfig_x86_64 | 71 +- .../arch/xen/configs/xenU_defconfig_x86_32 | 8 +- linux-2.6.11-xen-sparse/arch/xen/i386/Kconfig | 4 + .../arch/xen/kernel/evtchn.c | 9 +- .../arch/xen/x86_64/Kconfig | 12 + .../arch/xen/x86_64/defconfig | 1249 ----------------- .../arch/xen/x86_64/kernel/entry.S | 2 +- .../arch/xen/x86_64/kernel/ioport.c | 24 +- .../arch/xen/x86_64/kernel/ldt.c | 5 - .../arch/xen/x86_64/kernel/pci-dma.c | 7 +- .../arch/xen/x86_64/kernel/process.c | 98 +- .../arch/xen/x86_64/kernel/setup.c | 22 +- .../arch/xen/x86_64/kernel/setup64.c | 4 - .../arch/xen/x86_64/mm/hypervisor.c | 573 ++------ .../arch/xen/x86_64/mm/init.c | 4 +- .../arch/xen/x86_64/mm/ioremap.c | 22 +- .../arch/xen/x86_64/mm/pageattr.c | 1 - .../drivers/xen/privcmd/privcmd.c | 14 +- .../include/asm-xen/asm-i386/hypercall.h | 536 +++++++ .../include/asm-xen/asm-x86_64/desc.h | 16 +- .../include/asm-xen/asm-x86_64/fixmap.h | 4 +- .../include/asm-xen/asm-x86_64/hypercall.h | 30 +- .../include/asm-xen/asm-x86_64/mmu_context.h | 1 - .../include/asm-xen/asm-x86_64/pgalloc.h | 14 - .../include/asm-xen/asm-x86_64/pgtable.h | 6 +- .../include/asm-xen/asm-x86_64/system.h | 12 +- .../include/asm-xen/hypervisor.h | 512 +------ 30 files changed, 856 insertions(+), 2426 deletions(-) delete mode 100644 linux-2.6.11-xen-sparse/arch/xen/x86_64/defconfig create mode 100644 linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/hypercall.h diff --git a/.rootkeys b/.rootkeys index be1feb1894..de7c2d4fac 100644 --- a/.rootkeys +++ b/.rootkeys @@ -262,7 +262,6 @@ 3f68905c5eiA-lBMQSvXLMWS1ikDEA linux-2.6.11-xen-sparse/arch/xen/kernel/xen_proc.c 424efaa6xahU2q85_dT-SjUJEaivfg linux-2.6.11-xen-sparse/arch/xen/x86_64/Kconfig 424efaa6kKleWe45IrqsG8gkejgEQA linux-2.6.11-xen-sparse/arch/xen/x86_64/Makefile -424efaa7hjpGexXRf5TYBwgP7uT5Wg linux-2.6.11-xen-sparse/arch/xen/x86_64/defconfig 424efaa6HSyuVodl6SxFGj39vlp6MA linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/Makefile 424efaa7bVAw3Z_q0SdFivfNVavyIg linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/asm-offsets.c 424efaa7ddTVabh547Opf0u9vKmUXw linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/e820.c @@ -344,6 +343,7 @@ 40f5623akIoBsQ3KxSB2kufkbgONXQ linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/fixmap.h 41979925z1MsKU1SfuuheM1IFDQ_bA linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/floppy.h 4118b6a418gnL6AZsTdglC92YGqYTg linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/highmem.h +42539fb5A9hsS3NFQ-2VY4y1TONZZQ linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/hypercall.h 40f5623aJVXQwpJMOLE99XgvGsfQ8Q linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/io.h 40f5623aKXkBBxgpLx2NcvkncQ1Yyw linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/mach-xen/irq_vectors.h 40f5623aDMCsWOFO0jktZ4e8sjwvEg linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/mach-xen/setup_arch_post.h diff --git a/linux-2.6.11-xen-sparse/arch/xen/Kconfig b/linux-2.6.11-xen-sparse/arch/xen/Kconfig index 8205344169..728756c81a 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/Kconfig +++ b/linux-2.6.11-xen-sparse/arch/xen/Kconfig @@ -136,17 +136,17 @@ config XEN_SCRUB_PAGES choice prompt "Processor Type" - default X86 + default XEN_X86 -config X86 +config XEN_X86 bool "X86" help Choose this option if your computer is a X86 architecture. -config X86_64 +config XEN_X86_64 bool "X86_64" help - Choose this option if your computer is a X86 architecture. + Choose this option if your computer is a X86_64 architecture. endchoice @@ -158,11 +158,11 @@ config HAVE_ARCH_DEV_ALLOC_SKB source "init/Kconfig" -if X86 +if XEN_X86 source "arch/xen/i386/Kconfig" endif -if X86_64 +if XEN_X86_64 source "arch/xen/x86_64/Kconfig" endif diff --git a/linux-2.6.11-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 b/linux-2.6.11-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 index a781740c94..0dd968ee5d 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 +++ b/linux-2.6.11-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.11-xen0 -# Sat Mar 19 19:42:39 2005 +# Wed Apr 6 09:19:05 2005 # CONFIG_XEN=y CONFIG_ARCH_XEN=y @@ -14,14 +14,15 @@ CONFIG_XEN_PRIVILEGED_GUEST=y CONFIG_XEN_PHYSDEV_ACCESS=y CONFIG_XEN_BLKDEV_BACKEND=y # CONFIG_XEN_BLKDEV_TAP_BE is not set +CONFIG_XEN_BLKDEV_GRANT=y CONFIG_XEN_NETDEV_BACKEND=y CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_NETDEV_FRONTEND=y # CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set # CONFIG_XEN_BLKDEV_TAP is not set CONFIG_XEN_SCRUB_PAGES=y -CONFIG_X86=y -# CONFIG_X86_64 is not set +CONFIG_XEN_X86=y +# CONFIG_XEN_X86_64 is not set CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y # @@ -75,6 +76,7 @@ CONFIG_KMOD=y # X86 Processor Configuration # CONFIG_XENARCH="i386" +CONFIG_X86=y CONFIG_MMU=y CONFIG_UID16=y CONFIG_GENERIC_ISA_DMA=y diff --git a/linux-2.6.11-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64 b/linux-2.6.11-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64 index a2c3952f70..c0e9457e01 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64 +++ b/linux-2.6.11-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64 @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.10-xen0 -# Tue Mar 15 10:39:50 2005 +# Linux kernel version: 2.6.11-xen0 +# Wed Apr 6 09:21:54 2005 # CONFIG_XEN=y CONFIG_ARCH_XEN=y @@ -14,12 +14,12 @@ CONFIG_XEN_PRIVILEGED_GUEST=y CONFIG_XEN_PHYSDEV_ACCESS=y CONFIG_XEN_BLKDEV_BACKEND=y # CONFIG_XEN_BLKDEV_TAP_BE is not set +CONFIG_XEN_BLKDEV_GRANT=y CONFIG_XEN_NETDEV_BACKEND=y CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_NETDEV_FRONTEND=y # CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set # CONFIG_XEN_BLKDEV_TAP is not set -# CONFIG_XEN_WRITABLE_PAGETABLES=y CONFIG_XEN_SCRUB_PAGES=y # CONFIG_XEN_X86 is not set CONFIG_XEN_X86_64=y @@ -67,13 +67,14 @@ CONFIG_OBSOLETE_MODPARM=y # CONFIG_MODULE_SRCVERSION_ALL is not set CONFIG_KMOD=y CONFIG_XENARCH="x86_64" +CONFIG_X86=y CONFIG_MMU=y CONFIG_GENERIC_ISA_DMA=y CONFIG_GENERIC_IOMAP=y -# CONFIG_MK8 is not set CONFIG_X86_CMPXCHG=y CONFIG_X86_L1_CACHE_SHIFT=7 CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_X86_GOOD_APIC=y # CONFIG_HPET_TIMER is not set # CONFIG_SMP is not set @@ -92,7 +93,6 @@ CONFIG_GENERIC_IRQ_PROBE=y # X86_64 processor configuration # CONFIG_X86_64=y -CONFIG_X86=y CONFIG_64BIT=y # @@ -116,7 +116,6 @@ CONFIG_DUMMY_IOMMU=y # ACPI (Advanced Configuration and Power Interface) Support # # CONFIG_ACPI is not set -# CONFIG_ACPI_BLACKLIST_YEAR=0 # # CPU Frequency scaling @@ -124,19 +123,10 @@ CONFIG_DUMMY_IOMMU=y # CONFIG_CPU_FREQ is not set # -# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# Bus options (PCI etc.) # -CONFIG_PCI=y -CONFIG_PCI_DIRECT=y -CONFIG_PCI_LEGACY_PROC=y -# CONFIG_PCI_NAMES is not set # CONFIG_PCI_MMCONFIG is not set -# -# PCCARD (PCMCIA/CardBus) support -# -# CONFIG_PCCARD is not set - # # Executable file formats / Emulations # @@ -180,6 +170,7 @@ CONFIG_BLK_DEV_FD=y # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=y # CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_NBD is not set @@ -252,37 +243,22 @@ CONFIG_SCSI_SATA=y # CONFIG_SCSI_SATA_AHCI is not set # CONFIG_SCSI_SATA_SVW is not set CONFIG_SCSI_ATA_PIIX=y -# CONFIG_SCSI_SATA_NV is not set CONFIG_SCSI_SATA_PROMISE=y # CONFIG_SCSI_SATA_QSTOR is not set -CONFIG_SCSI_SATA_SX4=y -CONFIG_SCSI_SATA_SIL=y -# CONFIG_SCSI_SATA_SIS is not set -# CONFIG_SCSI_SATA_ULI is not set # CONFIG_SCSI_SATA_VIA is not set # CONFIG_SCSI_SATA_VITESSE is not set CONFIG_SCSI_BUSLOGIC=y # CONFIG_SCSI_OMIT_FLASHPOINT is not set -# CONFIG_SCSI_CPQFCTS is not set # CONFIG_SCSI_DMX3191D is not set -# CONFIG_SCSI_DTC3280 is not set # CONFIG_SCSI_EATA is not set # CONFIG_SCSI_EATA_PIO is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_GDTH is not set -# CONFIG_SCSI_GENERIC_NCR5380 is not set -# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set -# CONFIG_SCSI_NCR53C406A is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set -# CONFIG_SCSI_PAS16 is not set -# CONFIG_SCSI_PCI2000 is not set -# CONFIG_SCSI_PCI2220I is not set -# CONFIG_SCSI_PSI240I is not set -# CONFIG_SCSI_QLOGIC_FAS is not set # CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_FC is not set # CONFIG_SCSI_QLOGIC_1280 is not set @@ -292,14 +268,7 @@ CONFIG_SCSI_QLA2XXX=y # CONFIG_SCSI_QLA2300 is not set # CONFIG_SCSI_QLA2322 is not set # CONFIG_SCSI_QLA6312 is not set -# CONFIG_SCSI_SEAGATE is not set -# CONFIG_SCSI_SYM53C416 is not set -# CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_DC390T is not set -# CONFIG_SCSI_T128 is not set -# CONFIG_SCSI_U14_34F is not set -# CONFIG_SCSI_ULTRASTOR is not set -# CONFIG_SCSI_NSP32 is not set # CONFIG_SCSI_DEBUG is not set # @@ -409,6 +378,7 @@ CONFIG_SERIO_I8042=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_CT82C710 is not set # CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # @@ -532,6 +502,16 @@ CONFIG_USB_ARCH_HAS_OHCI=y # # CONFIG_USB_GADGET is not set +# +# MMC/SD Card support +# +# CONFIG_MMC is not set + +# +# InfiniBand support +# +# CONFIG_INFINIBAND is not set + # # File systems # @@ -548,6 +528,10 @@ CONFIG_JBD=y CONFIG_FS_MBCACHE=y # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set + +# +# XFS support +# # CONFIG_XFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_ROMFS_FS is not set @@ -607,7 +591,6 @@ CONFIG_RAMFS=y # # CONFIG_NFS_FS is not set # CONFIG_NFSD is not set -# CONFIG_EXPORTFS is not set # CONFIG_SMB_FS is not set # CONFIG_CIFS is not set # CONFIG_NCP_FS is not set @@ -688,6 +671,10 @@ CONFIG_NLS_CODEPAGE_437=y # # CONFIG_CRYPTO is not set +# +# Hardware crypto devices +# + # # Library routines # @@ -695,9 +682,3 @@ CONFIG_CRC_CCITT=y CONFIG_CRC32=y CONFIG_LIBCRC32C=y CONFIG_ZLIB_INFLATE=y - -# -# Firmware Drivers -# -CONFIG_PCI_LEGACY_PROC=y -CONFIG_PCI_NAMES=y diff --git a/linux-2.6.11-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 b/linux-2.6.11-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 index b1fc951a81..9b94c7d855 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 +++ b/linux-2.6.11-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.11-xenU -# Fri Mar 11 01:20:28 2005 +# Wed Apr 6 09:20:09 2005 # CONFIG_XEN=y CONFIG_ARCH_XEN=y @@ -12,13 +12,14 @@ CONFIG_NO_IDLE_HZ=y # # CONFIG_XEN_PRIVILEGED_GUEST is not set # CONFIG_XEN_PHYSDEV_ACCESS is not set +CONFIG_XEN_BLKDEV_GRANT=y CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_NETDEV_FRONTEND=y # CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set # CONFIG_XEN_BLKDEV_TAP is not set CONFIG_XEN_SCRUB_PAGES=y -CONFIG_X86=y -# CONFIG_X86_64 is not set +CONFIG_XEN_X86=y +# CONFIG_XEN_X86_64 is not set CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y # @@ -71,6 +72,7 @@ CONFIG_KMOD=y # X86 Processor Configuration # CONFIG_XENARCH="i386" +CONFIG_X86=y CONFIG_MMU=y CONFIG_UID16=y CONFIG_GENERIC_ISA_DMA=y diff --git a/linux-2.6.11-xen-sparse/arch/xen/i386/Kconfig b/linux-2.6.11-xen-sparse/arch/xen/i386/Kconfig index ccdccd0d24..fac0ad6ba9 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/i386/Kconfig +++ b/linux-2.6.11-xen-sparse/arch/xen/i386/Kconfig @@ -9,6 +9,10 @@ config XENARCH string default i386 +config X86 + bool + default y + config MMU bool default y diff --git a/linux-2.6.11-xen-sparse/arch/xen/kernel/evtchn.c b/linux-2.6.11-xen-sparse/arch/xen/kernel/evtchn.c index 345f6dff34..74e5d63a96 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/kernel/evtchn.c +++ b/linux-2.6.11-xen-sparse/arch/xen/kernel/evtchn.c @@ -81,8 +81,13 @@ extern fastcall unsigned int do_IRQ(struct pt_regs *regs); #else extern asmlinkage unsigned int do_IRQ(struct pt_regs *regs); #endif +#if defined (__i386__) +#define IRQ_REG orig_eax +#elif defined (__x86_64__) +#define IRQ_REG orig_rax +#endif #define do_IRQ(irq, regs) do { \ - (regs)->orig_eax = (irq); \ + (regs)->IRQ_REG = (irq); \ do_IRQ((regs)); \ } while (0) #endif @@ -102,7 +107,7 @@ void force_evtchn_callback(void) /* NB. Interrupts are disabled on entry. */ asmlinkage void evtchn_do_upcall(struct pt_regs *regs) { - unsigned long l1, l2; + u32 l1, l2; unsigned int l1i, l2i, port; int irq; shared_info_t *s = HYPERVISOR_shared_info; diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/Kconfig b/linux-2.6.11-xen-sparse/arch/xen/x86_64/Kconfig index 0dccbb4412..d0858312f5 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/Kconfig +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/Kconfig @@ -13,6 +13,18 @@ config XENARCH string default x86_64 +config X86_64 + bool + default y + help + Port to the x86-64 architecture. x86-64 is a 64-bit extension to the + classical 32-bit x86 architecture. For details see + . + +config X86 + bool + default y + config 64BIT def_bool y diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/defconfig b/linux-2.6.11-xen-sparse/arch/xen/x86_64/defconfig deleted file mode 100644 index 12b32c35fa..0000000000 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/defconfig +++ /dev/null @@ -1,1249 +0,0 @@ -# -# Automatically generated make config: don't edit -# Linux kernel version: 2.6.10-xen0 -# Fri Mar 11 14:30:42 2005 -# -CONFIG_XEN=y -CONFIG_ARCH_XEN=y -CONFIG_NO_IDLE_HZ=y - -# -# XEN -# -CONFIG_XEN_PRIVILEGED_GUEST=y -CONFIG_XEN_PHYSDEV_ACCESS=y -CONFIG_XEN_BLKDEV_BACKEND=y -CONFIG_XEN_NETDEV_BACKEND=y -CONFIG_XEN_BLKDEV_FRONTEND=y -CONFIG_XEN_NETDEV_FRONTEND=y -# CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set -# CONFIG_XEN_BLKDEV_TAP is not set -CONFIG_XEN_WRITABLE_PAGETABLES=y -CONFIG_XEN_SCRUB_PAGES=y -# CONFIG_XEN_X86 is not set -CONFIG_XEN_X86_64=y -CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y - -# -# Code maturity level options -# -CONFIG_EXPERIMENTAL=y -CONFIG_CLEAN_COMPILE=y -CONFIG_BROKEN_ON_SMP=y - -# -# General setup -# -CONFIG_LOCALVERSION="" -CONFIG_SWAP=y -CONFIG_SYSVIPC=y -CONFIG_POSIX_MQUEUE=y -CONFIG_BSD_PROCESS_ACCT=y -# CONFIG_BSD_PROCESS_ACCT_V3 is not set -CONFIG_SYSCTL=y -CONFIG_AUDIT=y -CONFIG_AUDITSYSCALL=y -CONFIG_LOG_BUF_SHIFT=14 -# CONFIG_HOTPLUG is not set -CONFIG_KOBJECT_UEVENT=y -# CONFIG_IKCONFIG is not set -# CONFIG_EMBEDDED is not set -CONFIG_KALLSYMS=y -CONFIG_KALLSYMS_EXTRA_PASS=y -CONFIG_FUTEX=y -CONFIG_EPOLL=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -CONFIG_SHMEM=y -CONFIG_CC_ALIGN_FUNCTIONS=0 -CONFIG_CC_ALIGN_LABELS=0 -CONFIG_CC_ALIGN_LOOPS=0 -CONFIG_CC_ALIGN_JUMPS=0 -# CONFIG_TINY_SHMEM is not set - -# -# Loadable module support -# -CONFIG_MODULES=y -CONFIG_MODULE_UNLOAD=y -# CONFIG_MODULE_FORCE_UNLOAD is not set -CONFIG_OBSOLETE_MODPARM=y -CONFIG_MODVERSIONS=y -# CONFIG_MODULE_SRCVERSION_ALL is not set -CONFIG_KMOD=y -CONFIG_XENARCH="x86_64" -CONFIG_MMU=y -CONFIG_GENERIC_ISA_DMA=y -CONFIG_GENERIC_IOMAP=y -# CONFIG_MK8 is not set -CONFIG_X86_CMPXCHG=y -CONFIG_X86_L1_CACHE_SHIFT=7 -CONFIG_RWSEM_GENERIC_SPINLOCK=y -CONFIG_X86_GOOD_APIC=y -# CONFIG_HPET_TIMER is not set -# CONFIG_SMP is not set -# CONFIG_PREEMPT is not set -CONFIG_MICROCODE=y -CONFIG_X86_CPUID=y -# CONFIG_NUMA is not set -# CONFIG_MTRR is not set -CONFIG_PCI=y -CONFIG_PCI_DIRECT=y -# CONFIG_EARLY_PRINTK is not set -CONFIG_GENERIC_HARDIRQS=y -CONFIG_GENERIC_IRQ_PROBE=y - -# -# X86_64 processor configuration -# -CONFIG_X86_64=y -CONFIG_X86=y -CONFIG_64BIT=y - -# -# Processor type and features -# -# CONFIG_MPSC is not set -CONFIG_GENERIC_CPU=y -CONFIG_X86_L1_CACHE_BYTES=128 -# CONFIG_X86_TSC is not set -# CONFIG_X86_MSR is not set -# CONFIG_GART_IOMMU is not set -CONFIG_DUMMY_IOMMU=y -# CONFIG_X86_MCE is not set - -# -# Power management options -# -# CONFIG_PM is not set - -# -# ACPI (Advanced Configuration and Power Interface) Support -# -# CONFIG_ACPI is not set -CONFIG_ACPI_BLACKLIST_YEAR=0 - -# -# CPU Frequency scaling -# -# CONFIG_CPU_FREQ is not set - -# -# Bus options (PCI etc.) -# -# CONFIG_PCI_MMCONFIG is not set -# CONFIG_UNORDERED_IO is not set - -# -# Executable file formats / Emulations -# -# CONFIG_IA32_EMULATION is not set - -# -# Executable file formats -# -CONFIG_BINFMT_ELF=y -CONFIG_BINFMT_MISC=y - -# -# Device Drivers -# - -# -# Generic Driver Options -# -CONFIG_STANDALONE=y -# CONFIG_PREVENT_FIRMWARE_BUILD is not set -CONFIG_FW_LOADER=m - -# -# Memory Technology Devices (MTD) -# -# CONFIG_MTD is not set - -# -# Parallel port support -# -# CONFIG_PARPORT is not set - -# -# Plug and Play support -# - -# -# Block devices -# -# CONFIG_BLK_DEV_FD is not set -# CONFIG_BLK_CPQ_DA is not set -# CONFIG_BLK_CPQ_CISS_DA is not set -# CONFIG_BLK_DEV_DAC960 is not set -# CONFIG_BLK_DEV_UMEM is not set -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_CRYPTOLOOP=m -CONFIG_BLK_DEV_NBD=m -# CONFIG_BLK_DEV_SX8 is not set -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_COUNT=16 -CONFIG_BLK_DEV_RAM_SIZE=16384 -CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="" -# CONFIG_LBD is not set -# CONFIG_CDROM_PKTCDVD is not set - -# -# IO Schedulers -# -CONFIG_IOSCHED_NOOP=y -CONFIG_IOSCHED_AS=y -CONFIG_IOSCHED_DEADLINE=y -CONFIG_IOSCHED_CFQ=y - -# -# ATA/ATAPI/MFM/RLL support -# -CONFIG_IDE=y -CONFIG_BLK_DEV_IDE=y - -# -# Please see Documentation/ide.txt for help/info on IDE drives -# -# CONFIG_BLK_DEV_IDE_SATA is not set -# CONFIG_BLK_DEV_HD_IDE is not set -CONFIG_BLK_DEV_IDEDISK=y -CONFIG_IDEDISK_MULTI_MODE=y -CONFIG_BLK_DEV_IDECD=y -# CONFIG_BLK_DEV_IDETAPE is not set -# CONFIG_BLK_DEV_IDEFLOPPY is not set -CONFIG_BLK_DEV_IDESCSI=y -# CONFIG_IDE_TASK_IOCTL is not set - -# -# IDE chipset support/bugfixes -# -CONFIG_IDE_GENERIC=y -# CONFIG_BLK_DEV_CMD640 is not set -CONFIG_BLK_DEV_IDEPCI=y -CONFIG_IDEPCI_SHARE_IRQ=y -# CONFIG_BLK_DEV_OFFBOARD is not set -CONFIG_BLK_DEV_GENERIC=y -# CONFIG_BLK_DEV_OPTI621 is not set -# CONFIG_BLK_DEV_RZ1000 is not set -CONFIG_BLK_DEV_IDEDMA_PCI=y -# CONFIG_BLK_DEV_IDEDMA_FORCED is not set -CONFIG_IDEDMA_PCI_AUTO=y -# CONFIG_IDEDMA_ONLYDISK is not set -# CONFIG_BLK_DEV_AEC62XX is not set -# CONFIG_BLK_DEV_ALI15X3 is not set -# CONFIG_BLK_DEV_AMD74XX is not set -# CONFIG_BLK_DEV_ATIIXP is not set -# CONFIG_BLK_DEV_CMD64X is not set -# CONFIG_BLK_DEV_TRIFLEX is not set -# CONFIG_BLK_DEV_CY82C693 is not set -# CONFIG_BLK_DEV_CS5520 is not set -# CONFIG_BLK_DEV_CS5530 is not set -# CONFIG_BLK_DEV_HPT34X is not set -# CONFIG_BLK_DEV_HPT366 is not set -# CONFIG_BLK_DEV_SC1200 is not set -CONFIG_BLK_DEV_PIIX=y -# CONFIG_BLK_DEV_NS87415 is not set -# CONFIG_BLK_DEV_PDC202XX_OLD is not set -# CONFIG_BLK_DEV_PDC202XX_NEW is not set -# CONFIG_BLK_DEV_SVWKS is not set -# CONFIG_BLK_DEV_SIIMAGE is not set -# CONFIG_BLK_DEV_SIS5513 is not set -# CONFIG_BLK_DEV_SLC90E66 is not set -# CONFIG_BLK_DEV_TRM290 is not set -# CONFIG_BLK_DEV_VIA82CXXX is not set -# CONFIG_IDE_ARM is not set -CONFIG_BLK_DEV_IDEDMA=y -# CONFIG_IDEDMA_IVB is not set -CONFIG_IDEDMA_AUTO=y -# CONFIG_BLK_DEV_HD is not set - -# -# SCSI device support -# -CONFIG_SCSI=y -CONFIG_SCSI_PROC_FS=y - -# -# SCSI support type (disk, tape, CD-ROM) -# -CONFIG_BLK_DEV_SD=y -CONFIG_CHR_DEV_ST=m -CONFIG_CHR_DEV_OSST=m -CONFIG_BLK_DEV_SR=m -CONFIG_BLK_DEV_SR_VENDOR=y -CONFIG_CHR_DEV_SG=y - -# -# Some SCSI devices (e.g. CD jukebox) support multiple LUNs -# -# CONFIG_SCSI_MULTI_LUN is not set -CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_LOGGING=y - -# -# SCSI Transport Attributes -# -CONFIG_SCSI_SPI_ATTRS=m -CONFIG_SCSI_FC_ATTRS=m - -# -# SCSI low-level drivers -# -# CONFIG_BLK_DEV_3W_XXXX_RAID is not set -# CONFIG_SCSI_3W_9XXX is not set -# CONFIG_SCSI_ACARD is not set -# CONFIG_SCSI_AACRAID is not set -# CONFIG_SCSI_AIC7XXX is not set -# CONFIG_SCSI_AIC7XXX_OLD is not set -# CONFIG_SCSI_AIC79XX is not set -# CONFIG_MEGARAID_NEWGEN is not set -# CONFIG_MEGARAID_LEGACY is not set -CONFIG_SCSI_SATA=y -# CONFIG_SCSI_SATA_AHCI is not set -# CONFIG_SCSI_SATA_SVW is not set -CONFIG_SCSI_ATA_PIIX=y -# CONFIG_SCSI_SATA_NV is not set -# CONFIG_SCSI_SATA_PROMISE is not set -# CONFIG_SCSI_SATA_SX4 is not set -# CONFIG_SCSI_SATA_SIL is not set -# CONFIG_SCSI_SATA_SIS is not set -# CONFIG_SCSI_SATA_ULI is not set -# CONFIG_SCSI_SATA_VIA is not set -# CONFIG_SCSI_SATA_VITESSE is not set -# CONFIG_SCSI_BUSLOGIC is not set -# CONFIG_SCSI_DMX3191D is not set -# CONFIG_SCSI_EATA is not set -# CONFIG_SCSI_EATA_PIO is not set -# CONFIG_SCSI_FUTURE_DOMAIN is not set -# CONFIG_SCSI_GDTH is not set -# CONFIG_SCSI_IPS is not set -# CONFIG_SCSI_INITIO is not set -# CONFIG_SCSI_INIA100 is not set -# CONFIG_SCSI_SYM53C8XX_2 is not set -# CONFIG_SCSI_IPR is not set -# CONFIG_SCSI_QLOGIC_ISP is not set -# CONFIG_SCSI_QLOGIC_FC is not set -# CONFIG_SCSI_QLOGIC_1280 is not set -CONFIG_SCSI_QLA2XXX=y -# CONFIG_SCSI_QLA21XX is not set -# CONFIG_SCSI_QLA22XX is not set -# CONFIG_SCSI_QLA2300 is not set -# CONFIG_SCSI_QLA2322 is not set -# CONFIG_SCSI_QLA6312 is not set -# CONFIG_SCSI_QLA6322 is not set -# CONFIG_SCSI_DC395x is not set -# CONFIG_SCSI_DC390T is not set -# CONFIG_SCSI_DEBUG is not set - -# -# Multi-device support (RAID and LVM) -# -CONFIG_MD=y -CONFIG_BLK_DEV_MD=y -CONFIG_MD_LINEAR=m -CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID10=m -CONFIG_MD_RAID5=m -CONFIG_MD_RAID6=m -CONFIG_MD_MULTIPATH=m -# CONFIG_MD_FAULTY is not set -CONFIG_BLK_DEV_DM=m -CONFIG_DM_CRYPT=m -CONFIG_DM_SNAPSHOT=m -CONFIG_DM_MIRROR=m -CONFIG_DM_ZERO=m - -# -# Fusion MPT device support -# -# CONFIG_FUSION is not set - -# -# IEEE 1394 (FireWire) support -# -# CONFIG_IEEE1394 is not set - -# -# I2O device support -# -# CONFIG_I2O is not set - -# -# Networking support -# -CONFIG_NET=y - -# -# Networking options -# -CONFIG_PACKET=y -CONFIG_PACKET_MMAP=y -CONFIG_NETLINK_DEV=y -CONFIG_UNIX=y -CONFIG_NET_KEY=m -CONFIG_INET=y -CONFIG_IP_MULTICAST=y -CONFIG_IP_ADVANCED_ROUTER=y -CONFIG_IP_MULTIPLE_TABLES=y -CONFIG_IP_ROUTE_FWMARK=y -CONFIG_IP_ROUTE_MULTIPATH=y -CONFIG_IP_ROUTE_VERBOSE=y -# CONFIG_IP_PNP is not set -CONFIG_NET_IPIP=m -CONFIG_NET_IPGRE=m -CONFIG_NET_IPGRE_BROADCAST=y -CONFIG_IP_MROUTE=y -CONFIG_IP_PIMSM_V1=y -CONFIG_IP_PIMSM_V2=y -# CONFIG_ARPD is not set -CONFIG_SYN_COOKIES=y -CONFIG_INET_AH=m -CONFIG_INET_ESP=m -CONFIG_INET_IPCOMP=m -CONFIG_INET_TUNNEL=m -CONFIG_IP_TCPDIAG=y -# CONFIG_IP_TCPDIAG_IPV6 is not set - -# -# IP: Virtual Server Configuration -# -CONFIG_IP_VS=m -# CONFIG_IP_VS_DEBUG is not set -CONFIG_IP_VS_TAB_BITS=12 - -# -# IPVS transport protocol load balancing support -# -CONFIG_IP_VS_PROTO_TCP=y -CONFIG_IP_VS_PROTO_UDP=y -CONFIG_IP_VS_PROTO_ESP=y -CONFIG_IP_VS_PROTO_AH=y - -# -# IPVS scheduler -# -CONFIG_IP_VS_RR=m -CONFIG_IP_VS_WRR=m -CONFIG_IP_VS_LC=m -CONFIG_IP_VS_WLC=m -CONFIG_IP_VS_LBLC=m -CONFIG_IP_VS_LBLCR=m -CONFIG_IP_VS_DH=m -CONFIG_IP_VS_SH=m -CONFIG_IP_VS_SED=m -CONFIG_IP_VS_NQ=m - -# -# IPVS application helper -# -CONFIG_IP_VS_FTP=m -CONFIG_IPV6=m -CONFIG_IPV6_PRIVACY=y -CONFIG_INET6_AH=m -CONFIG_INET6_ESP=m -CONFIG_INET6_IPCOMP=m -CONFIG_INET6_TUNNEL=m -CONFIG_IPV6_TUNNEL=m -CONFIG_NETFILTER=y -# CONFIG_NETFILTER_DEBUG is not set -CONFIG_BRIDGE_NETFILTER=y - -# -# IP: Netfilter Configuration -# -CONFIG_IP_NF_CONNTRACK=m -CONFIG_IP_NF_CT_ACCT=y -# CONFIG_IP_NF_CONNTRACK_MARK is not set -CONFIG_IP_NF_CT_PROTO_SCTP=m -CONFIG_IP_NF_FTP=m -CONFIG_IP_NF_IRC=m -CONFIG_IP_NF_TFTP=m -CONFIG_IP_NF_AMANDA=m -CONFIG_IP_NF_QUEUE=m -CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_LIMIT=m -CONFIG_IP_NF_MATCH_IPRANGE=m -CONFIG_IP_NF_MATCH_MAC=m -CONFIG_IP_NF_MATCH_PKTTYPE=m -CONFIG_IP_NF_MATCH_MARK=m -CONFIG_IP_NF_MATCH_MULTIPORT=m -CONFIG_IP_NF_MATCH_TOS=m -CONFIG_IP_NF_MATCH_RECENT=m -CONFIG_IP_NF_MATCH_ECN=m -CONFIG_IP_NF_MATCH_DSCP=m -CONFIG_IP_NF_MATCH_AH_ESP=m -CONFIG_IP_NF_MATCH_LENGTH=m -CONFIG_IP_NF_MATCH_TTL=m -CONFIG_IP_NF_MATCH_TCPMSS=m -CONFIG_IP_NF_MATCH_HELPER=m -CONFIG_IP_NF_MATCH_STATE=m -CONFIG_IP_NF_MATCH_CONNTRACK=m -CONFIG_IP_NF_MATCH_OWNER=m -CONFIG_IP_NF_MATCH_PHYSDEV=m -CONFIG_IP_NF_MATCH_ADDRTYPE=m -CONFIG_IP_NF_MATCH_REALM=m -CONFIG_IP_NF_MATCH_SCTP=m -CONFIG_IP_NF_MATCH_COMMENT=m -# CONFIG_IP_NF_MATCH_HASHLIMIT is not set -CONFIG_IP_NF_FILTER=m -CONFIG_IP_NF_TARGET_REJECT=m -CONFIG_IP_NF_TARGET_LOG=m -CONFIG_IP_NF_TARGET_ULOG=m -CONFIG_IP_NF_TARGET_TCPMSS=m -CONFIG_IP_NF_NAT=m -CONFIG_IP_NF_NAT_NEEDED=y -CONFIG_IP_NF_TARGET_MASQUERADE=m -CONFIG_IP_NF_TARGET_REDIRECT=m -CONFIG_IP_NF_TARGET_NETMAP=m -CONFIG_IP_NF_TARGET_SAME=m -CONFIG_IP_NF_NAT_LOCAL=y -CONFIG_IP_NF_NAT_SNMP_BASIC=m -CONFIG_IP_NF_NAT_IRC=m -CONFIG_IP_NF_NAT_FTP=m -CONFIG_IP_NF_NAT_TFTP=m -CONFIG_IP_NF_NAT_AMANDA=m -CONFIG_IP_NF_MANGLE=m -CONFIG_IP_NF_TARGET_TOS=m -CONFIG_IP_NF_TARGET_ECN=m -CONFIG_IP_NF_TARGET_DSCP=m -CONFIG_IP_NF_TARGET_MARK=m -CONFIG_IP_NF_TARGET_CLASSIFY=m -CONFIG_IP_NF_RAW=m -CONFIG_IP_NF_TARGET_NOTRACK=m -CONFIG_IP_NF_ARPTABLES=m -CONFIG_IP_NF_ARPFILTER=m -CONFIG_IP_NF_ARP_MANGLE=m -# CONFIG_IP_NF_COMPAT_IPCHAINS is not set -# CONFIG_IP_NF_COMPAT_IPFWADM is not set - -# -# IPv6: Netfilter Configuration -# -# CONFIG_IP6_NF_QUEUE is not set -CONFIG_IP6_NF_IPTABLES=m -CONFIG_IP6_NF_MATCH_LIMIT=m -CONFIG_IP6_NF_MATCH_MAC=m -CONFIG_IP6_NF_MATCH_RT=m -CONFIG_IP6_NF_MATCH_OPTS=m -CONFIG_IP6_NF_MATCH_FRAG=m -CONFIG_IP6_NF_MATCH_HL=m -CONFIG_IP6_NF_MATCH_MULTIPORT=m -CONFIG_IP6_NF_MATCH_OWNER=m -CONFIG_IP6_NF_MATCH_MARK=m -CONFIG_IP6_NF_MATCH_IPV6HEADER=m -CONFIG_IP6_NF_MATCH_AHESP=m -CONFIG_IP6_NF_MATCH_LENGTH=m -CONFIG_IP6_NF_MATCH_EUI64=m -CONFIG_IP6_NF_MATCH_PHYSDEV=m -CONFIG_IP6_NF_FILTER=m -CONFIG_IP6_NF_TARGET_LOG=m -CONFIG_IP6_NF_MANGLE=m -CONFIG_IP6_NF_TARGET_MARK=m -CONFIG_IP6_NF_RAW=m - -# -# Bridge: Netfilter Configuration -# -CONFIG_BRIDGE_NF_EBTABLES=m -CONFIG_BRIDGE_EBT_BROUTE=m -CONFIG_BRIDGE_EBT_T_FILTER=m -CONFIG_BRIDGE_EBT_T_NAT=m -CONFIG_BRIDGE_EBT_802_3=m -CONFIG_BRIDGE_EBT_AMONG=m -CONFIG_BRIDGE_EBT_ARP=m -CONFIG_BRIDGE_EBT_IP=m -CONFIG_BRIDGE_EBT_LIMIT=m -CONFIG_BRIDGE_EBT_MARK=m -CONFIG_BRIDGE_EBT_PKTTYPE=m -CONFIG_BRIDGE_EBT_STP=m -CONFIG_BRIDGE_EBT_VLAN=m -CONFIG_BRIDGE_EBT_ARPREPLY=m -CONFIG_BRIDGE_EBT_DNAT=m -CONFIG_BRIDGE_EBT_MARK_T=m -CONFIG_BRIDGE_EBT_REDIRECT=m -CONFIG_BRIDGE_EBT_SNAT=m -CONFIG_BRIDGE_EBT_LOG=m -CONFIG_XFRM=y -CONFIG_XFRM_USER=y - -# -# SCTP Configuration (EXPERIMENTAL) -# -CONFIG_IP_SCTP=m -# CONFIG_SCTP_DBG_MSG is not set -# CONFIG_SCTP_DBG_OBJCNT is not set -# CONFIG_SCTP_HMAC_NONE is not set -# CONFIG_SCTP_HMAC_SHA1 is not set -CONFIG_SCTP_HMAC_MD5=y -CONFIG_ATM=m -CONFIG_ATM_CLIP=m -# CONFIG_ATM_CLIP_NO_ICMP is not set -CONFIG_ATM_LANE=m -# CONFIG_ATM_MPOA is not set -CONFIG_ATM_BR2684=m -# CONFIG_ATM_BR2684_IPFILTER is not set -CONFIG_BRIDGE=m -CONFIG_VLAN_8021Q=m -# CONFIG_DECNET is not set -CONFIG_LLC=m -# CONFIG_LLC2 is not set -CONFIG_IPX=m -# CONFIG_IPX_INTERN is not set -CONFIG_ATALK=m -CONFIG_DEV_APPLETALK=y -CONFIG_IPDDP=m -CONFIG_IPDDP_ENCAP=y -CONFIG_IPDDP_DECAP=y -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -CONFIG_NET_DIVERT=y -# CONFIG_ECONET is not set -CONFIG_WAN_ROUTER=m - -# -# QoS and/or fair queueing -# -CONFIG_NET_SCHED=y -CONFIG_NET_SCH_CLK_JIFFIES=y -# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set -# CONFIG_NET_SCH_CLK_CPU is not set -CONFIG_NET_SCH_CBQ=m -CONFIG_NET_SCH_HTB=m -CONFIG_NET_SCH_HFSC=m -CONFIG_NET_SCH_ATM=m -CONFIG_NET_SCH_PRIO=m -CONFIG_NET_SCH_RED=m -CONFIG_NET_SCH_SFQ=m -CONFIG_NET_SCH_TEQL=m -CONFIG_NET_SCH_TBF=m -CONFIG_NET_SCH_GRED=m -CONFIG_NET_SCH_DSMARK=m -CONFIG_NET_SCH_NETEM=m -CONFIG_NET_SCH_INGRESS=m -CONFIG_NET_QOS=y -CONFIG_NET_ESTIMATOR=y -CONFIG_NET_CLS=y -CONFIG_NET_CLS_TCINDEX=m -CONFIG_NET_CLS_ROUTE4=m -CONFIG_NET_CLS_ROUTE=y -CONFIG_NET_CLS_FW=m -CONFIG_NET_CLS_U32=m -CONFIG_CLS_U32_PERF=y -CONFIG_NET_CLS_IND=y -CONFIG_NET_CLS_RSVP=m -CONFIG_NET_CLS_RSVP6=m -# CONFIG_NET_CLS_ACT is not set -CONFIG_NET_CLS_POLICE=y - -# -# Network testing -# -# CONFIG_NET_PKTGEN is not set -CONFIG_NETPOLL=y -# CONFIG_NETPOLL_RX is not set -CONFIG_NETPOLL_TRAP=y -CONFIG_NET_POLL_CONTROLLER=y -# CONFIG_HAMRADIO is not set -CONFIG_IRDA=m - -# -# IrDA protocols -# -CONFIG_IRLAN=m -CONFIG_IRNET=m -CONFIG_IRCOMM=m -# CONFIG_IRDA_ULTRA is not set - -# -# IrDA options -# -CONFIG_IRDA_CACHE_LAST_LSAP=y -CONFIG_IRDA_FAST_RR=y -# CONFIG_IRDA_DEBUG is not set - -# -# Infrared-port device drivers -# - -# -# SIR device drivers -# -CONFIG_IRTTY_SIR=m - -# -# Dongle support -# -CONFIG_DONGLE=y -CONFIG_ESI_DONGLE=m -CONFIG_ACTISYS_DONGLE=m -CONFIG_TEKRAM_DONGLE=m -CONFIG_LITELINK_DONGLE=m -CONFIG_MA600_DONGLE=m -CONFIG_GIRBIL_DONGLE=m -CONFIG_MCP2120_DONGLE=m -CONFIG_OLD_BELKIN_DONGLE=m -CONFIG_ACT200L_DONGLE=m - -# -# Old SIR device drivers -# -# CONFIG_IRPORT_SIR is not set - -# -# Old Serial dongle support -# - -# -# FIR device drivers -# -# CONFIG_VLSI_FIR is not set -CONFIG_BT=m -CONFIG_BT_L2CAP=m -CONFIG_BT_SCO=m -CONFIG_BT_RFCOMM=m -CONFIG_BT_RFCOMM_TTY=y -CONFIG_BT_BNEP=m -CONFIG_BT_BNEP_MC_FILTER=y -CONFIG_BT_BNEP_PROTO_FILTER=y -CONFIG_BT_HIDP=m - -# -# Bluetooth device drivers -# -CONFIG_BT_HCIUART=m -CONFIG_BT_HCIUART_H4=y -CONFIG_BT_HCIUART_BCSP=y -CONFIG_BT_HCIUART_BCSP_TXCRC=y -CONFIG_BT_HCIVHCI=m -CONFIG_NETDEVICES=y -CONFIG_DUMMY=m -CONFIG_BONDING=m -CONFIG_EQUALIZER=m -CONFIG_TUN=m -CONFIG_ETHERTAP=m - -# -# ARCnet devices -# -# CONFIG_ARCNET is not set - -# -# Ethernet (10 or 100Mbit) -# -CONFIG_NET_ETHERNET=y -CONFIG_MII=y -# CONFIG_HAPPYMEAL is not set -# CONFIG_SUNGEM is not set -# CONFIG_NET_VENDOR_3COM is not set - -# -# Tulip family network device support -# -# CONFIG_NET_TULIP is not set -CONFIG_HP100=y -CONFIG_NET_PCI=y -# CONFIG_PCNET32 is not set -# CONFIG_AMD8111_ETH is not set -# CONFIG_ADAPTEC_STARFIRE is not set -# CONFIG_B44 is not set -# CONFIG_FORCEDETH is not set -# CONFIG_DGRS is not set -# CONFIG_EEPRO100 is not set -CONFIG_E100=y -# CONFIG_E100_NAPI is not set -# CONFIG_FEALNX is not set -# CONFIG_NATSEMI is not set -# CONFIG_NE2K_PCI is not set -# CONFIG_8139CP is not set -# CONFIG_8139TOO is not set -# CONFIG_SIS900 is not set -# CONFIG_EPIC100 is not set -# CONFIG_SUNDANCE is not set -# CONFIG_VIA_RHINE is not set - -# -# Ethernet (1000 Mbit) -# -# CONFIG_ACENIC is not set -# CONFIG_DL2K is not set -CONFIG_E1000=y -# CONFIG_E1000_NAPI is not set -# CONFIG_NS83820 is not set -# CONFIG_HAMACHI is not set -# CONFIG_YELLOWFIN is not set -# CONFIG_R8169 is not set -# CONFIG_SK98LIN is not set -# CONFIG_VIA_VELOCITY is not set -# CONFIG_TIGON3 is not set - -# -# Ethernet (10000 Mbit) -# -# CONFIG_IXGB is not set -# CONFIG_S2IO is not set - -# -# Token Ring devices -# -# CONFIG_TR is not set - -# -# Wireless LAN (non-hamradio) -# -CONFIG_NET_RADIO=y - -# -# Obsolete Wireless cards support (pre-802.11) -# -# CONFIG_STRIP is not set - -# -# Wireless 802.11b ISA/PCI cards support -# -# CONFIG_HERMES is not set -CONFIG_ATMEL=m -# CONFIG_PCI_ATMEL is not set - -# -# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support -# -CONFIG_NET_WIRELESS=y - -# -# Wan interfaces -# -# CONFIG_WAN is not set - -# -# ATM drivers -# -CONFIG_ATM_TCP=m -# CONFIG_ATM_LANAI is not set -# CONFIG_ATM_ENI is not set -# CONFIG_ATM_FIRESTREAM is not set -# CONFIG_ATM_ZATM is not set -# CONFIG_ATM_IDT77252 is not set -# CONFIG_ATM_AMBASSADOR is not set -# CONFIG_ATM_HORIZON is not set -# CONFIG_ATM_FORE200E_MAYBE is not set -# CONFIG_ATM_HE is not set -# CONFIG_FDDI is not set -# CONFIG_HIPPI is not set -CONFIG_PPP=m -CONFIG_PPP_MULTILINK=y -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m -# CONFIG_PPP_BSDCOMP is not set -CONFIG_PPPOE=m -CONFIG_PPPOATM=m -CONFIG_SLIP=m -CONFIG_SLIP_COMPRESSED=y -CONFIG_SLIP_SMART=y -# CONFIG_SLIP_MODE_SLIP6 is not set -# CONFIG_NET_FC is not set -# CONFIG_SHAPER is not set -CONFIG_NETCONSOLE=m - -# -# ISDN subsystem -# -# CONFIG_ISDN is not set - -# -# Telephony Support -# -# CONFIG_PHONE is not set - -# -# Input device support -# -CONFIG_INPUT=y - -# -# Userland interfaces -# -CONFIG_INPUT_MOUSEDEV=y -CONFIG_INPUT_MOUSEDEV_PSAUX=y -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -# CONFIG_INPUT_JOYDEV is not set -# CONFIG_INPUT_TSDEV is not set -# CONFIG_INPUT_EVDEV is not set -# CONFIG_INPUT_EVBUG is not set - -# -# Input I/O drivers -# -# CONFIG_GAMEPORT is not set -CONFIG_SOUND_GAMEPORT=y -CONFIG_SERIO=y -CONFIG_SERIO_I8042=y -CONFIG_SERIO_SERPORT=y -# CONFIG_SERIO_CT82C710 is not set -# CONFIG_SERIO_PCIPS2 is not set -# CONFIG_SERIO_RAW is not set - -# -# Input Device Drivers -# -CONFIG_INPUT_KEYBOARD=y -CONFIG_KEYBOARD_ATKBD=y -# CONFIG_KEYBOARD_SUNKBD is not set -# CONFIG_KEYBOARD_LKKBD is not set -# CONFIG_KEYBOARD_XTKBD is not set -# CONFIG_KEYBOARD_NEWTON is not set -CONFIG_INPUT_MOUSE=y -CONFIG_MOUSE_PS2=y -# CONFIG_MOUSE_SERIAL is not set -# CONFIG_MOUSE_VSXXXAA is not set -# CONFIG_INPUT_JOYSTICK is not set -# CONFIG_INPUT_TOUCHSCREEN is not set -# CONFIG_INPUT_MISC is not set - -# -# Character devices -# -CONFIG_VT=y -CONFIG_VT_CONSOLE=y -CONFIG_HW_CONSOLE=y -# CONFIG_SERIAL_NONSTANDARD is not set - -# -# Serial drivers -# -# CONFIG_SERIAL_8250 is not set - -# -# Non-8250 serial port support -# -CONFIG_UNIX98_PTYS=y -CONFIG_LEGACY_PTYS=y -CONFIG_LEGACY_PTY_COUNT=256 - -# -# IPMI -# -# CONFIG_IPMI_HANDLER is not set - -# -# Watchdog Cards -# -# CONFIG_WATCHDOG is not set -# CONFIG_HW_RANDOM is not set -# CONFIG_NVRAM is not set -# CONFIG_RTC is not set -# CONFIG_GEN_RTC is not set -# CONFIG_DTLK is not set -# CONFIG_R3964 is not set -# CONFIG_APPLICOM is not set - -# -# Ftape, the floppy tape device driver -# -# CONFIG_FTAPE is not set -# CONFIG_AGP is not set -# CONFIG_DRM is not set -# CONFIG_MWAVE is not set -# CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set - -# -# I2C support -# -# CONFIG_I2C is not set - -# -# Dallas's 1-wire bus -# -# CONFIG_W1 is not set - -# -# Misc devices -# -# CONFIG_IBM_ASM is not set - -# -# Multimedia devices -# -# CONFIG_VIDEO_DEV is not set - -# -# Digital Video Broadcasting Devices -# -# CONFIG_DVB is not set - -# -# Graphics support -# -# CONFIG_FB is not set -# CONFIG_VIDEO_SELECT is not set - -# -# Console display driver support -# -CONFIG_VGA_CONSOLE=y -CONFIG_DUMMY_CONSOLE=y - -# -# Sound -# -# CONFIG_SOUND is not set - -# -# USB support -# -# CONFIG_USB is not set -CONFIG_USB_ARCH_HAS_HCD=y -CONFIG_USB_ARCH_HAS_OHCI=y - -# -# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information -# - -# -# USB Gadget Support -# -# CONFIG_USB_GADGET is not set - -# -# File systems -# -# CONFIG_EXT2_FS is not set -CONFIG_EXT3_FS=y -CONFIG_EXT3_FS_XATTR=y -CONFIG_EXT3_FS_POSIX_ACL=y -CONFIG_EXT3_FS_SECURITY=y -CONFIG_JBD=y -# CONFIG_JBD_DEBUG is not set -CONFIG_FS_MBCACHE=y -# CONFIG_REISERFS_FS is not set -# CONFIG_JFS_FS is not set -CONFIG_FS_POSIX_ACL=y -# CONFIG_XFS_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_ROMFS_FS is not set -# CONFIG_QUOTA is not set -CONFIG_DNOTIFY=y -# CONFIG_AUTOFS_FS is not set -# CONFIG_AUTOFS4_FS is not set - -# -# CD-ROM/DVD Filesystems -# -CONFIG_ISO9660_FS=y -CONFIG_JOLIET=y -CONFIG_ZISOFS=y -CONFIG_ZISOFS_FS=y -CONFIG_UDF_FS=m -CONFIG_UDF_NLS=y - -# -# DOS/FAT/NT Filesystems -# -CONFIG_FAT_FS=m -CONFIG_MSDOS_FS=m -CONFIG_VFAT_FS=m -CONFIG_FAT_DEFAULT_CODEPAGE=437 -CONFIG_FAT_DEFAULT_IOCHARSET="ascii" -# CONFIG_NTFS_FS is not set - -# -# Pseudo filesystems -# -CONFIG_PROC_FS=y -# CONFIG_PROC_KCORE is not set -CONFIG_SYSFS=y -# CONFIG_DEVFS_FS is not set -CONFIG_DEVPTS_FS_XATTR=y -CONFIG_DEVPTS_FS_SECURITY=y -CONFIG_TMPFS=y -CONFIG_TMPFS_XATTR=y -CONFIG_TMPFS_SECURITY=y -# CONFIG_HUGETLBFS is not set -# CONFIG_HUGETLB_PAGE is not set -CONFIG_RAMFS=y - -# -# Miscellaneous filesystems -# -# CONFIG_ADFS_FS is not set -CONFIG_AFFS_FS=m -CONFIG_HFS_FS=m -CONFIG_HFSPLUS_FS=m -CONFIG_BEFS_FS=m -# CONFIG_BEFS_DEBUG is not set -CONFIG_BFS_FS=m -CONFIG_EFS_FS=m -CONFIG_CRAMFS=m -CONFIG_VXFS_FS=m -# CONFIG_HPFS_FS is not set -CONFIG_QNX4FS_FS=m -# CONFIG_QNX4FS_RW is not set -CONFIG_SYSV_FS=m -CONFIG_UFS_FS=m -# CONFIG_UFS_FS_WRITE is not set - -# -# Network File Systems -# -CONFIG_NFS_FS=m -CONFIG_NFS_V3=y -CONFIG_NFS_V4=y -CONFIG_NFS_DIRECTIO=y -CONFIG_NFSD=m -CONFIG_NFSD_V3=y -CONFIG_NFSD_V4=y -CONFIG_NFSD_TCP=y -CONFIG_LOCKD=m -CONFIG_LOCKD_V4=y -CONFIG_EXPORTFS=m -CONFIG_SUNRPC=m -CONFIG_SUNRPC_GSS=m -CONFIG_RPCSEC_GSS_KRB5=m -CONFIG_RPCSEC_GSS_SPKM3=m -CONFIG_SMB_FS=m -# CONFIG_SMB_NLS_DEFAULT is not set -CONFIG_CIFS=m -# CONFIG_CIFS_STATS is not set -CONFIG_CIFS_XATTR=y -CONFIG_CIFS_POSIX=y -# CONFIG_CIFS_EXPERIMENTAL is not set -CONFIG_NCP_FS=m -CONFIG_NCPFS_PACKET_SIGNING=y -CONFIG_NCPFS_IOCTL_LOCKING=y -CONFIG_NCPFS_STRONG=y -CONFIG_NCPFS_NFS_NS=y -CONFIG_NCPFS_OS2_NS=y -CONFIG_NCPFS_SMALLDOS=y -CONFIG_NCPFS_NLS=y -CONFIG_NCPFS_EXTRAS=y -# CONFIG_CODA_FS is not set -# CONFIG_AFS_FS is not set - -# -# Partition Types -# -CONFIG_PARTITION_ADVANCED=y -# CONFIG_ACORN_PARTITION is not set -CONFIG_OSF_PARTITION=y -# CONFIG_AMIGA_PARTITION is not set -# CONFIG_ATARI_PARTITION is not set -CONFIG_MAC_PARTITION=y -CONFIG_MSDOS_PARTITION=y -CONFIG_BSD_DISKLABEL=y -CONFIG_MINIX_SUBPARTITION=y -CONFIG_SOLARIS_X86_PARTITION=y -CONFIG_UNIXWARE_DISKLABEL=y -# CONFIG_LDM_PARTITION is not set -CONFIG_SGI_PARTITION=y -# CONFIG_ULTRIX_PARTITION is not set -CONFIG_SUN_PARTITION=y -CONFIG_EFI_PARTITION=y - -# -# Native Language Support -# -CONFIG_NLS=y -CONFIG_NLS_DEFAULT="utf8" -CONFIG_NLS_CODEPAGE_437=y -CONFIG_NLS_CODEPAGE_737=m -CONFIG_NLS_CODEPAGE_775=m -CONFIG_NLS_CODEPAGE_850=m -CONFIG_NLS_CODEPAGE_852=m -CONFIG_NLS_CODEPAGE_855=m -CONFIG_NLS_CODEPAGE_857=m -CONFIG_NLS_CODEPAGE_860=m -CONFIG_NLS_CODEPAGE_861=m -CONFIG_NLS_CODEPAGE_862=m -CONFIG_NLS_CODEPAGE_863=m -CONFIG_NLS_CODEPAGE_864=m -CONFIG_NLS_CODEPAGE_865=m -CONFIG_NLS_CODEPAGE_866=m -CONFIG_NLS_CODEPAGE_869=m -CONFIG_NLS_CODEPAGE_936=m -CONFIG_NLS_CODEPAGE_950=m -CONFIG_NLS_CODEPAGE_932=m -CONFIG_NLS_CODEPAGE_949=m -CONFIG_NLS_CODEPAGE_874=m -CONFIG_NLS_ISO8859_8=m -CONFIG_NLS_CODEPAGE_1250=m -CONFIG_NLS_CODEPAGE_1251=m -CONFIG_NLS_ASCII=y -CONFIG_NLS_ISO8859_1=m -CONFIG_NLS_ISO8859_2=m -CONFIG_NLS_ISO8859_3=m -CONFIG_NLS_ISO8859_4=m -CONFIG_NLS_ISO8859_5=m -CONFIG_NLS_ISO8859_6=m -CONFIG_NLS_ISO8859_7=m -CONFIG_NLS_ISO8859_9=m -CONFIG_NLS_ISO8859_13=m -CONFIG_NLS_ISO8859_14=m -CONFIG_NLS_ISO8859_15=m -CONFIG_NLS_KOI8_R=m -CONFIG_NLS_KOI8_U=m -CONFIG_NLS_UTF8=m - -# -# Security options -# -# CONFIG_KEYS is not set -CONFIG_SECURITY=y -CONFIG_SECURITY_NETWORK=y -CONFIG_SECURITY_CAPABILITIES=y -# CONFIG_SECURITY_SECLVL is not set -CONFIG_SECURITY_SELINUX=y -CONFIG_SECURITY_SELINUX_BOOTPARAM=y -CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1 -CONFIG_SECURITY_SELINUX_DISABLE=y -CONFIG_SECURITY_SELINUX_DEVELOP=y -# CONFIG_SECURITY_SELINUX_MLS is not set - -# -# Cryptographic options -# -CONFIG_CRYPTO=y -CONFIG_CRYPTO_HMAC=y -CONFIG_CRYPTO_NULL=m -CONFIG_CRYPTO_MD4=m -CONFIG_CRYPTO_MD5=m -CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA256=m -CONFIG_CRYPTO_SHA512=m -CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_DES=m -CONFIG_CRYPTO_BLOWFISH=m -CONFIG_CRYPTO_TWOFISH=m -CONFIG_CRYPTO_SERPENT=m -# CONFIG_CRYPTO_AES is not set -CONFIG_CRYPTO_CAST5=m -CONFIG_CRYPTO_CAST6=m -CONFIG_CRYPTO_TEA=m -CONFIG_CRYPTO_ARC4=m -CONFIG_CRYPTO_KHAZAD=m -# CONFIG_CRYPTO_ANUBIS is not set -CONFIG_CRYPTO_DEFLATE=m -CONFIG_CRYPTO_MICHAEL_MIC=m -CONFIG_CRYPTO_CRC32C=m -# CONFIG_CRYPTO_TEST is not set - -# -# Library routines -# -CONFIG_CRC_CCITT=m -CONFIG_CRC32=y -CONFIG_LIBCRC32C=m -CONFIG_ZLIB_INFLATE=y -CONFIG_ZLIB_DEFLATE=m - -# -# Firmware Drivers -# -# CONFIG_EDD is not set -# CONFIG_PCI_LEGACY_PROC is not set -# CONFIG_PCI_NAMES is not set diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/entry.S b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/entry.S index d7cf509c1e..0f87192649 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/entry.S +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/entry.S @@ -336,7 +336,7 @@ badsys: ENTRY(int_ret_from_sys_call) XEN_GET_VCPU_INFO(%r11) XEN_BLOCK_EVENTS(%r11) - testb $1,SS-ARGOFFSET+4(%rsp) + testb $3,CS-ARGOFFSET(%rsp) jnz 1f /* Need to set the proper %ss (not NULL) for ring 3 iretq */ movl $__KERNEL_DS,SS-ARGOFFSET(%rsp) diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/ioport.c b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/ioport.c index 7c34ca0ad2..ff96e22341 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/ioport.c +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/ioport.c @@ -16,7 +16,7 @@ #include #include #include -#include +#include /* * sys_iopl has to be used when you want to access the IO ports @@ -29,19 +29,15 @@ asmlinkage long sys_iopl(unsigned int new_io_pl) { unsigned int old_io_pl = current->thread.io_pl; - dom0_op_t op; + physdev_op_t op; if (new_io_pl > 3) return -EINVAL; - /* Trying to gain more privileges? */ - if (new_io_pl > old_io_pl) { - if (!capable(CAP_SYS_RAWIO)) - return -EPERM; - } - - if (!(xen_start_info.flags & SIF_PRIVILEGED)) - return -EPERM; + + /* Need "raw I/O" privileges for direct port access. */ + if ((new_io_pl > old_io_pl) && !capable(CAP_SYS_RAWIO)) + return -EPERM; /* Maintain OS privileges even if user attempts to relinquish them. */ if (new_io_pl == 0) @@ -51,13 +47,11 @@ asmlinkage long sys_iopl(unsigned int new_io_pl) current->thread.io_pl = new_io_pl; /* Force the change at ring 0. */ - op.cmd = DOM0_IOPL; - op.u.iopl.domain = DOMID_SELF; - op.u.iopl.iopl = new_io_pl; - HYPERVISOR_dom0_op(&op); + op.cmd = PHYSDEVOP_SET_IOPL; + op.u.set_iopl.iopl = new_io_pl; + HYPERVISOR_physdev_op(&op); return 0; - } /* diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/ldt.c b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/ldt.c index ba268585a6..ee340923c1 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/ldt.c +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/ldt.c @@ -29,7 +29,6 @@ static void flush_ldt(void *null) { if (current->active_mm) { load_LDT(¤t->active_mm->context); - flush_page_update_queue(); } } #endif @@ -70,7 +69,6 @@ static int alloc_ldt(mm_context_t *pc, unsigned mincount, int reload) make_pages_readonly(pc->ldt, (pc->size * LDT_ENTRY_SIZE) / PAGE_SIZE); load_LDT(pc); - flush_page_update_queue(); #ifdef CONFIG_SMP mask = cpumask_of_cpu(smp_processor_id()); if (!cpus_equal(current->mm->cpu_vm_mask, mask)) @@ -83,7 +81,6 @@ static int alloc_ldt(mm_context_t *pc, unsigned mincount, int reload) if (oldsize) { make_pages_writable(oldldt, (oldsize * LDT_ENTRY_SIZE) / PAGE_SIZE); - flush_page_update_queue(); if (oldsize*LDT_ENTRY_SIZE > PAGE_SIZE) vfree(oldldt); else @@ -100,7 +97,6 @@ static inline int copy_ldt(mm_context_t *new, mm_context_t *old) memcpy(new->ldt, old->ldt, old->size*LDT_ENTRY_SIZE); make_pages_readonly(new->ldt, (new->size * LDT_ENTRY_SIZE) / PAGE_SIZE); - flush_page_update_queue(); return 0; } @@ -136,7 +132,6 @@ void destroy_context(struct mm_struct *mm) make_pages_writable(mm->context.ldt, (mm->context.size * LDT_ENTRY_SIZE) / PAGE_SIZE); - flush_page_update_queue(); if (mm->context.size*LDT_ENTRY_SIZE > PAGE_SIZE) vfree(mm->context.ldt); else diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/pci-dma.c b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/pci-dma.c index de04f86bef..fcb85e93ec 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/pci-dma.c +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/pci-dma.c @@ -97,10 +97,9 @@ xen_contig_memory(unsigned long vstart, unsigned int order) pmd = pmd_offset(pud, (vstart + (i*PAGE_SIZE))); pte = pte_offset_kernel(pmd, (vstart + (i*PAGE_SIZE))); pfn = pte->pte >> PAGE_SHIFT; - queue_l1_entry_update(pte, 0); + xen_l1_entry_update(pte, 0); phys_to_machine_mapping[(__pa(vstart)>>PAGE_SHIFT)+i] = (u32)INVALID_P2M_ENTRY; - flush_page_update_queue(); if (HYPERVISOR_dom_mem_op(MEMOP_decrease_reservation, &pfn, 1, 0) != 1) BUG(); } @@ -113,9 +112,9 @@ xen_contig_memory(unsigned long vstart, unsigned int order) pud = pud_offset(pgd, (vstart + (i*PAGE_SIZE))); pmd = pmd_offset(pud, (vstart + (i*PAGE_SIZE))); pte = pte_offset_kernel(pmd, (vstart + (i*PAGE_SIZE))); - queue_l1_entry_update( + xen_l1_entry_update( pte, ((pfn+i)<>PAGE_SHIFT)+i); phys_to_machine_mapping[(__pa(vstart)>>PAGE_SHIFT)+i] = pfn+i; diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/process.c b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/process.c index f17d8c36f1..9d4b13f9a6 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/process.c +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/process.c @@ -47,8 +47,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -203,7 +203,7 @@ void exit_thread(void) void load_gs_index(unsigned gs) { - __load_gs_index(gs); + HYPERVISOR_set_segment_base(SEGBASE_GS_USER_SEL, gs); } void flush_thread(void) @@ -346,6 +346,14 @@ out: HYPERVISOR_set_debugreg((register), \ (thread->debugreg ## register)) + +static inline void __save_init_fpu( struct task_struct *tsk ) +{ + asm volatile( "rex64 ; fxsave %0 ; fnclex" + : "=m" (tsk->thread.i387.fxsave)); + tsk->thread_info->status &= ~TS_USEDFPU; +} + /* * switch_to(x,y) should switch tasks from x to y. * @@ -359,61 +367,68 @@ struct task_struct *__switch_to(struct task_struct *prev_p, struct task_struct * *next = &next_p->thread; int cpu = smp_processor_id(); struct tss_struct *tss = &per_cpu(init_tss, cpu); - dom0_op_t op; - - /* NB. No need to disable interrupts as already done in sched.c */ - /* __cli(); */ - -// MULTICALL_flush_page_update_queue(); - - /* never put a printk in __switch_to... printk() calls wake_up*() indirectly */ - + physdev_op_t iopl_op, iobmp_op; + multicall_entry_t _mcl[8], *mcl = _mcl; + /* * This is basically '__unlazy_fpu', except that we queue a * multicall to indicate FPU task switch, rather than * synchronously trapping to Xen. */ if (prev_p->thread_info->status & TS_USEDFPU) { - save_init_fpu(prev_p); - queue_multicall0(__HYPERVISOR_fpu_taskswitch); + __save_init_fpu(prev_p); /* _not_ save_init_fpu() */ + mcl->op = __HYPERVISOR_fpu_taskswitch; + mcl->args[0] = 1; + mcl++; } /* * Reload esp0, LDT and the page table pointer: */ tss->rsp0 = next->rsp0; -// queue_multicall1(__HYPERVISOR_stack_switch, tss->rsp0); - HYPERVISOR_stack_switch(__KERNEL_DS, tss->rsp0); + mcl->op = __HYPERVISOR_stack_switch; + mcl->args[0] = __KERNEL_DS; + mcl->args[1] = tss->rsp0; + mcl++; /* * Load the per-thread Thread-Local Storage descriptor. * This is load_TLS(next, cpu) with multicalls. */ #define C(i) do { \ - if (unlikely(next->tls_array[i] != prev->tls_array[i])) \ - queue_multicall2(__HYPERVISOR_update_descriptor, \ - virt_to_machine(&get_cpu_gdt_table(cpu) \ - [GDT_ENTRY_TLS_MIN + i]), \ - (unsigned long) &next->tls_array[i]); \ + if (unlikely(next->tls_array[i] != prev->tls_array[i])) { \ + mcl->op = __HYPERVISOR_update_descriptor; \ + mcl->args[0] = virt_to_machine(&get_cpu_gdt_table(cpu) \ + [GDT_ENTRY_TLS_MIN + i]); \ + mcl->args[1] = (unsigned long) ((u64 *) &next->tls_array[i]); \ + mcl->args[2] = (unsigned long) ((u64 *) &next->tls_array[i]); \ + mcl++; \ + } \ } while (0) C(0); C(1); C(2); #undef C - if (xen_start_info.flags & SIF_PRIVILEGED) { - op.cmd = DOM0_IOPL; - op.u.iopl.domain = DOMID_SELF; - op.u.iopl.iopl = next->io_pl; - op.interface_version = DOM0_INTERFACE_VERSION; - HYPERVISOR_dom0_op(&op); -#if 0 - queue_multicall1(__HYPERVISOR_dom0_op, (unsigned long)&op); -#endif + if (unlikely(prev->io_pl != next->io_pl)) { + iopl_op.cmd = PHYSDEVOP_SET_IOPL; + iopl_op.u.set_iopl.iopl = next->io_pl; + mcl->op = __HYPERVISOR_physdev_op; + mcl->args[0] = (unsigned long)&iopl_op; + mcl++; } - /* EXECUTE ALL TASK SWITCH XEN SYSCALLS AT THIS POINT. */ -// execute_multicall_list(); - /* __sti(); */ + if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr)) { + iobmp_op.cmd = + PHYSDEVOP_SET_IOBITMAP; + iobmp_op.u.set_iobitmap.bitmap = + (unsigned long)next->io_bitmap_ptr; + iobmp_op.u.set_iobitmap.nr_ports = + next->io_bitmap_ptr ? IO_BITMAP_BITS : 0; + mcl->op = __HYPERVISOR_physdev_op; + mcl->args[0] = (unsigned long)&iobmp_op; + mcl++; + } + (void)HYPERVISOR_multicall(_mcl, mcl - _mcl); /* * Switch DS and ES. * This won't pick up thread selector changes, but I guess that is ok. @@ -485,25 +500,6 @@ struct task_struct *__switch_to(struct task_struct *prev_p, struct task_struct * loaddebug(next, 7); } - /* - * Handle the IO bitmap - */ - if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr)) { - if (next->io_bitmap_ptr) - /* - * Copy the relevant range of the IO bitmap. - * Normally this is 128 bytes or less: - */ - memcpy(tss->io_bitmap, next->io_bitmap_ptr, - max(prev->io_bitmap_max, next->io_bitmap_max)); - else { - /* - * Clear any possible leftover bits: - */ - memset(tss->io_bitmap, 0xff, prev->io_bitmap_max); - } - } - return prev_p; } diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/setup.c b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/setup.c index 764fcf45aa..b99a3e749c 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/setup.c +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/setup.c @@ -58,7 +58,7 @@ #include #include #include - +#include #include "setup_arch_pre.h" #include @@ -604,7 +604,9 @@ static void __init print_memory_map(char *who) void __init setup_arch(char **cmdline_p) { unsigned long low_mem_size; - int i,j; + int i, j; + physdev_op_t op; + #if 0 ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV); #else @@ -805,16 +807,6 @@ void __init setup_arch(char **cmdline_p) /* XXX Disable irqdebug until we have a way to avoid interrupt * conflicts. */ /* noirqdebug_setup(""); */ - /* If we are a privileged guest OS then we should request IO privs. */ - if (xen_start_info.flags & SIF_PRIVILEGED) { - dom0_op_t op; - op.cmd = DOM0_IOPL; - op.u.iopl.domain = DOMID_SELF; - op.u.iopl.iopl = 3; - if (HYPERVISOR_dom0_op(&op) != 0) - panic("Unable to obtain IOPL, despite SIF_PRIVILEGED"); - current->thread.io_pl = 3; - } #ifdef CONFIG_XEN_PRIVILEGED_GUEST /* @@ -843,9 +835,13 @@ void __init setup_arch(char **cmdline_p) pci_mem_start = low_mem_size; #ifdef CONFIG_GART_IOMMU - iommu_hole_init(); + iommu_hole_init(); #endif + op.cmd = PHYSDEVOP_SET_IOPL; + op.u.set_iopl.iopl = current->thread.io_pl = 1; + HYPERVISOR_physdev_op(&op); + if (xen_start_info.flags & SIF_INITDOMAIN) { if (!(xen_start_info.flags & SIF_PRIVILEGED)) panic("Xen granted us console access " diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/setup64.c b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/setup64.c index a33404d9a1..a7db1930d8 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/setup64.c +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/kernel/setup64.c @@ -218,7 +218,6 @@ void __init cpu_gdt_init(struct desc_ptr *gdt_descr) frames[f] = virt_to_machine(va) >> PAGE_SHIFT; make_page_readonly((void *)va); } - flush_page_update_queue(); if (HYPERVISOR_set_gdt(frames, gdt_descr->size / sizeof (struct desc_struct))) BUG(); @@ -328,9 +327,7 @@ void __init cpu_init (void) enter_lazy_tlb(&init_mm, me); load_LDT(&init_mm.context); - flush_page_update_queue(); -#if 0 /* * Clear all 6 debug registers: */ @@ -339,7 +336,6 @@ void __init cpu_init (void) CD(0); CD(1); CD(2); CD(3); /* no db4 and db5 */; CD(6); CD(7); #undef CD -#endif #if 0 fpu_init(); #endif diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/hypervisor.c b/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/hypervisor.c index 1908dfa478..f7ab076cb8 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/hypervisor.c +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/hypervisor.c @@ -38,552 +38,193 @@ #include #include #include +#include #include -#include #include #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) #include #endif -/* - * This suffices to protect us if we ever move to SMP domains. - * Further, it protects us against interrupts. At the very least, this is - * required for the network driver which flushes the update queue before - * pushing new receive buffers. - */ -static spinlock_t update_lock = SPIN_LOCK_UNLOCKED; - -/* Linux 2.6 isn't using the traditional batched interface. */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -#define QUEUE_SIZE 2048 -#define pte_offset_kernel pte_offset -#else -#ifdef CONFIG_SMP -#define QUEUE_SIZE 1 -#else -/* #define QUEUE_SIZE 128 */ -#define QUEUE_SIZE 1 -#endif -#endif - -DEFINE_PER_CPU(mmu_update_t, update_queue[QUEUE_SIZE]); -DEFINE_PER_CPU(unsigned int, mmu_update_queue_idx); - -/* - * MULTICALL_flush_page_update_queue: - * This is a version of the flush which queues as part of a multicall. - */ -void MULTICALL_flush_page_update_queue(void) -{ - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - unsigned int _idx; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - if ( (_idx = idx) != 0 ) - { - per_cpu(mmu_update_queue_idx, cpu) = 0; - wmb(); /* Make sure index is cleared first to avoid double updates. */ - queue_multicall3(__HYPERVISOR_mmu_update, - (unsigned long)&per_cpu(update_queue[0], cpu), - (unsigned long)_idx, - (unsigned long)NULL); - } - spin_unlock_irqrestore(&update_lock, flags); -} - -static inline void __flush_page_update_queue(void) -{ - int cpu = smp_processor_id(); - unsigned int _idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(mmu_update_queue_idx, cpu) = 0; - wmb(); /* Make sure index is cleared first to avoid double updates. */ - if ( unlikely(HYPERVISOR_mmu_update(&per_cpu(update_queue[0], cpu), _idx, NULL) < 0) ) - { - printk(KERN_ALERT "Failed to execute MMU updates (returning to %lx)\n", - (unsigned long)__builtin_return_address(0)); - BUG(); - } -} - -void _flush_page_update_queue(void) -{ - int cpu = smp_processor_id(); - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - if ( per_cpu(mmu_update_queue_idx, cpu) != 0 ) __flush_page_update_queue(); - spin_unlock_irqrestore(&update_lock, flags); -} - -static inline void increment_index(void) -{ - int cpu = smp_processor_id(); - per_cpu(mmu_update_queue_idx, cpu)++; - if ( unlikely(per_cpu(mmu_update_queue_idx, cpu) == QUEUE_SIZE) ) __flush_page_update_queue(); -} - -static inline void increment_index_and_flush(void) -{ - int cpu = smp_processor_id(); - per_cpu(mmu_update_queue_idx, cpu)++; - __flush_page_update_queue(); -} - -void queue_l1_entry_update(pte_t *ptr, unsigned long val) -{ - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = virt_to_machine(ptr); - per_cpu(update_queue[idx], cpu).val = val; - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); -} - -void queue_l2_entry_update(pmd_t *ptr, pmd_t val) -{ - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = virt_to_machine(ptr); - per_cpu(update_queue[idx], cpu).val = val.pmd; - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); -} - - -void queue_pt_switch(unsigned long ptr) -{ - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_NEW_BASEPTR; - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); -} - -void queue_tlb_flush(void) -{ - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_TLB_FLUSH; - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); -} - -void queue_invlpg(unsigned long ptr) -{ - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).ptr |= ptr & PAGE_MASK; - per_cpu(update_queue[idx], cpu).val = MMUEXT_INVLPG; - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); -} - -void queue_pgd_pin(unsigned long ptr) -{ - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_PIN_L4_TABLE; - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); -} - -void queue_pgd_unpin(unsigned long ptr) -{ - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_UNPIN_TABLE; - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); -} - -void queue_pud_pin(unsigned long ptr) -{ - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_PIN_L3_TABLE; - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); -} - -void queue_pud_unpin(unsigned long ptr) -{ - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_UNPIN_TABLE; - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); -} - -void queue_pmd_pin(unsigned long ptr) -{ - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_PIN_L2_TABLE; - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); -} - -void queue_pmd_unpin(unsigned long ptr) -{ - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_UNPIN_TABLE; - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); -} - -void queue_pte_pin(unsigned long ptr) +void xen_l1_entry_update(pte_t *ptr, unsigned long val) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_PIN_L1_TABLE; - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); + mmu_update_t u; + u.ptr = virt_to_machine(ptr); + u.val = val; + BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0); } -void queue_pte_unpin(unsigned long ptr) +void xen_l2_entry_update(pmd_t *ptr, pmd_t val) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_UNPIN_TABLE; - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); + mmu_update_t u; + u.ptr = virt_to_machine(ptr); + u.val = val.pmd; + BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0); } -void queue_set_ldt(unsigned long ptr, unsigned long len) +void xen_l3_entry_update(pud_t *ptr, pud_t val) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = MMU_EXTENDED_COMMAND | ptr; - per_cpu(update_queue[idx], cpu).val = MMUEXT_SET_LDT | (len << MMUEXT_CMD_SHIFT); - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); + mmu_update_t u; + u.ptr = virt_to_machine(ptr); + u.val = val.pud; + BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0); } -void queue_machphys_update(unsigned long mfn, unsigned long pfn) +void xen_l4_entry_update(pgd_t *ptr, pgd_t val) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = (mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE; - per_cpu(update_queue[idx], cpu).val = pfn; - increment_index(); - spin_unlock_irqrestore(&update_lock, flags); + mmu_update_t u; + u.ptr = virt_to_machine(ptr); + u.val = val.pgd; + BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0); } -/* queue and flush versions of the above */ -void xen_l1_entry_update(pte_t *ptr, unsigned long val) +void xen_pt_switch(unsigned long ptr) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = virt_to_machine(ptr); - per_cpu(update_queue[idx], cpu).val = val; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_NEW_BASEPTR; + op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT); + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } -void xen_l2_entry_update(pmd_t *ptr, unsigned long val) +void xen_new_user_pt(unsigned long ptr) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = virt_to_machine(ptr); - per_cpu(update_queue[idx], cpu).val = val; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_NEW_USER_BASEPTR; + op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT); + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } -void xen_l3_entry_update(pud_t *ptr, unsigned long val) +void xen_tlb_flush(void) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = virt_to_machine(ptr); - per_cpu(update_queue[idx], cpu).val = val; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_TLB_FLUSH_LOCAL; + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } -void xen_l4_entry_update(pgd_t *ptr, unsigned long val) +void xen_invlpg(unsigned long ptr) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = virt_to_machine(ptr); - per_cpu(update_queue[idx], cpu).val = val; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_INVLPG_LOCAL; + op.linear_addr = ptr & PAGE_MASK; + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } -void xen_pt_switch(unsigned long ptr) +#ifdef CONFIG_SMP +void xen_tlb_flush_all(void) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_NEW_BASEPTR; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_TLB_FLUSH_ALL; + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } -void xen_new_user_pt(unsigned long ptr) +void xen_tlb_flush_mask(cpumask_t mask) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_NEW_USER_BASEPTR; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_TLB_FLUSH_MULTI; + op.cpuset = mask.bits[0]; + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } -void xen_tlb_flush(void) +void xen_invlpg_all(unsigned long ptr) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_TLB_FLUSH; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_INVLPG_ALL; + op.linear_addr = ptr & PAGE_MASK; + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } -void xen_invlpg(unsigned long ptr) +void xen_invlpg_mask(cpumask_t mask, unsigned long ptr) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).ptr |= ptr & PAGE_MASK; - per_cpu(update_queue[idx], cpu).val = MMUEXT_INVLPG; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_INVLPG_MULTI; + op.cpuset = mask.bits[0]; + op.linear_addr = ptr & PAGE_MASK; + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } +#endif void xen_pgd_pin(unsigned long ptr) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_PIN_L4_TABLE; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_PIN_L4_TABLE; + op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT); + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } void xen_pgd_unpin(unsigned long ptr) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_UNPIN_TABLE; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_UNPIN_TABLE; + op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT); + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } void xen_pud_pin(unsigned long ptr) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_PIN_L3_TABLE; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_PIN_L3_TABLE; + op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT); + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } void xen_pud_unpin(unsigned long ptr) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_UNPIN_TABLE; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_UNPIN_TABLE; + op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT); + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } void xen_pmd_pin(unsigned long ptr) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_PIN_L2_TABLE; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_PIN_L2_TABLE; + op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT); + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } void xen_pmd_unpin(unsigned long ptr) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_UNPIN_TABLE; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_UNPIN_TABLE; + op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT); + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } void xen_pte_pin(unsigned long ptr) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_PIN_L1_TABLE; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_PIN_L1_TABLE; + op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT); + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); + } void xen_pte_unpin(unsigned long ptr) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = phys_to_machine(ptr); - per_cpu(update_queue[idx], cpu).ptr |= MMU_EXTENDED_COMMAND; - per_cpu(update_queue[idx], cpu).val = MMUEXT_UNPIN_TABLE; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_UNPIN_TABLE; + op.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT); + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } void xen_set_ldt(unsigned long ptr, unsigned long len) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = MMU_EXTENDED_COMMAND | ptr; - per_cpu(update_queue[idx], cpu).val = MMUEXT_SET_LDT | (len << MMUEXT_CMD_SHIFT); - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + struct mmuext_op op; + op.cmd = MMUEXT_SET_LDT; + op.linear_addr = ptr; + op.nr_ents = len; + BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } void xen_machphys_update(unsigned long mfn, unsigned long pfn) { - int cpu = smp_processor_id(); - int idx; - unsigned long flags; - spin_lock_irqsave(&update_lock, flags); - idx = per_cpu(mmu_update_queue_idx, cpu); - per_cpu(update_queue[idx], cpu).ptr = (mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE; - per_cpu(update_queue[idx], cpu).val = pfn; - increment_index_and_flush(); - spin_unlock_irqrestore(&update_lock, flags); + mmu_update_t u; + u.ptr = (mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE; + u.val = pfn; + BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0); } #ifdef CONFIG_XEN_PHYSDEV_ACCESS - unsigned long allocate_empty_lowmem_region(unsigned long pages) { pgd_t *pgd; @@ -599,8 +240,6 @@ unsigned long allocate_empty_lowmem_region(unsigned long pages) if ( vstart == 0 ) return 0UL; - printk("vstart = %lx, order = %d\n", vstart, order); - scrub_pages(vstart, 1 << order); pfn_array = vmalloc((1<pte >> PAGE_SHIFT; - queue_l1_entry_update(pte, 0); + xen_l1_entry_update(pte, 0); phys_to_machine_mapping[__pa(vstart)>>PAGE_SHIFT] = (u32)INVALID_P2M_ENTRY; } /* Flush updates through and flush the TLB. */ - xen_tlb_flush(); + flush_tlb_all(); balloon_put_pages(pfn_array, 1 << order); diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/init.c b/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/init.c index 21abb8277d..d28c0966d6 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/init.c +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/init.c @@ -122,7 +122,7 @@ void make_page_readonly(void *va) pud = pud_offset(pgd, addr); pmd = pmd_offset(pud, addr); pte = pte_offset_kernel(pmd, addr); - queue_l1_entry_update(pte, (*(unsigned long*)pte)&~_PAGE_RW); + xen_l1_entry_update(pte, (*(unsigned long*)pte)&~_PAGE_RW); __flush_tlb_one(addr); } @@ -140,7 +140,7 @@ void make_page_writable(void *va) pud = pud_offset(pgd, addr); pmd = pmd_offset(pud, addr); pte = pte_offset_kernel(pmd, addr); - queue_l1_entry_update(pte, (*(unsigned long*)pte)|_PAGE_RW); + xen_l1_entry_update(pte, (*(unsigned long*)pte)|_PAGE_RW); __flush_tlb_one(addr); } diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/ioremap.c b/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/ioremap.c index 04a6950bec..d769f4d0ae 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/ioremap.c +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/ioremap.c @@ -417,15 +417,7 @@ int direct_remap_area_pages(struct mm_struct *mm, int i; unsigned long start_address; #define MAX_DIRECTMAP_MMU_QUEUE 130 - mmu_update_t u[MAX_DIRECTMAP_MMU_QUEUE], *w, *v; - - v = w = &u[0]; - if (domid != DOMID_LOCAL) { - u[0].ptr = MMU_EXTENDED_COMMAND; - u[0].val = MMUEXT_SET_FOREIGNDOM; - u[0].val |= (unsigned long)domid << 16; - v = w = &u[1]; - } + mmu_update_t u[MAX_DIRECTMAP_MMU_QUEUE], *v = u; start_address = address; @@ -437,11 +429,11 @@ int direct_remap_area_pages(struct mm_struct *mm, __direct_remap_area_pages(mm, start_address, address-start_address, - w); + u); - if (HYPERVISOR_mmu_update(u, v - u, NULL) < 0) + if (HYPERVISOR_mmu_update(u, v - u, NULL, domid) < 0) return -EFAULT; - v = w; + v = u; start_address = address; } @@ -456,13 +448,13 @@ int direct_remap_area_pages(struct mm_struct *mm, v++; } - if (v != w) { + if (v != u) { /* get the ptep's filled in */ __direct_remap_area_pages(mm, start_address, address-start_address, - w); - if (unlikely(HYPERVISOR_mmu_update(u, v - u, NULL) < 0)) + u); + if (unlikely(HYPERVISOR_mmu_update(u, v - u, NULL, domid) < 0)) return -EFAULT; } diff --git a/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/pageattr.c b/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/pageattr.c index d9aefb8218..63e9a38a17 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/pageattr.c +++ b/linux-2.6.11-xen-sparse/arch/xen/x86_64/mm/pageattr.c @@ -23,7 +23,6 @@ void pte_free(struct page *pte) xen_pte_unpin(__pa(ptep)); make_page_writable(ptep); - flush_page_update_queue(); __free_page(pte); } diff --git a/linux-2.6.11-xen-sparse/drivers/xen/privcmd/privcmd.c b/linux-2.6.11-xen-sparse/drivers/xen/privcmd/privcmd.c index 017ed4a477..0b78cc7e8f 100644 --- a/linux-2.6.11-xen-sparse/drivers/xen/privcmd/privcmd.c +++ b/linux-2.6.11-xen-sparse/drivers/xen/privcmd/privcmd.c @@ -49,6 +49,7 @@ static int privcmd_ioctl(struct inode *inode, struct file *file, if ( copy_from_user(&hypercall, (void *)data, sizeof(hypercall)) ) return -EFAULT; +#if defined(__i386__) __asm__ __volatile__ ( "pushl %%ebx; pushl %%ecx; pushl %%edx; pushl %%esi; pushl %%edi; " "movl 4(%%eax),%%ebx ;" @@ -60,7 +61,18 @@ static int privcmd_ioctl(struct inode *inode, struct file *file, TRAP_INSTR "; " "popl %%edi; popl %%esi; popl %%edx; popl %%ecx; popl %%ebx" : "=a" (ret) : "0" (&hypercall) : "memory" ); - +#elif defined (__x86_64__) + __asm__ __volatile__ ( + "movq %5,%%r10; movq %6,%%r8;" TRAP_INSTR + : "=a" (ret) + : "a" ((unsigned long)hypercall.op), + "D" ((unsigned long)hypercall.arg[0]), + "S" ((unsigned long)hypercall.arg[1]), + "d" ((unsigned long)hypercall.arg[2]), + "g" ((unsigned long)hypercall.arg[3]), + "g" ((unsigned long)hypercall.arg[4]) + : "r11","rcx","r8","r10","memory"); +#endif } break; diff --git a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/hypercall.h b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/hypercall.h new file mode 100644 index 0000000000..4dff4bbd72 --- /dev/null +++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/hypercall.h @@ -0,0 +1,536 @@ +/****************************************************************************** + * hypercall.h + * + * Linux-specific hypervisor handling. + * + * Copyright (c) 2002-2004, K A Fraser + * + * This file may be distributed separately from the Linux kernel, or + * incorporated into other software packages, subject to the following license: + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this source file (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef __HYPERCALL_H__ +#define __HYPERCALL_H__ +#include + +/* + * Assembler stubs for hyper-calls. + */ + +static inline int +HYPERVISOR_set_trap_table( + trap_info_t *table) +{ + int ret; + unsigned long ignore; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ignore) + : "0" (__HYPERVISOR_set_trap_table), "1" (table) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_mmu_update( + mmu_update_t *req, int count, int *success_count, domid_t domid) +{ + int ret; + unsigned long ign1, ign2, ign3, ign4; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4) + : "0" (__HYPERVISOR_mmu_update), "1" (req), "2" (count), + "3" (success_count), "4" (domid) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_mmuext_op( + struct mmuext_op *op, int count, int *success_count, domid_t domid) +{ + int ret; + unsigned long ign1, ign2, ign3, ign4; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4) + : "0" (__HYPERVISOR_mmuext_op), "1" (op), "2" (count), + "3" (success_count), "4" (domid) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_set_gdt( + unsigned long *frame_list, int entries) +{ + int ret; + unsigned long ign1, ign2; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2) + : "0" (__HYPERVISOR_set_gdt), "1" (frame_list), "2" (entries) + : "memory" ); + + + return ret; +} + +static inline int +HYPERVISOR_stack_switch( + unsigned long ss, unsigned long esp) +{ + int ret; + unsigned long ign1, ign2; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2) + : "0" (__HYPERVISOR_stack_switch), "1" (ss), "2" (esp) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_set_callbacks( + unsigned long event_selector, unsigned long event_address, + unsigned long failsafe_selector, unsigned long failsafe_address) +{ + int ret; + unsigned long ign1, ign2, ign3, ign4; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4) + : "0" (__HYPERVISOR_set_callbacks), "1" (event_selector), + "2" (event_address), "3" (failsafe_selector), "4" (failsafe_address) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_fpu_taskswitch( + int set) +{ + int ret; + unsigned long ign; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign) + : "0" (__HYPERVISOR_fpu_taskswitch), "1" (set) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_yield( + void) +{ + int ret; + unsigned long ign; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign) + : "0" (__HYPERVISOR_sched_op), "1" (SCHEDOP_yield) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_block( + void) +{ + int ret; + unsigned long ign1; + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1) + : "0" (__HYPERVISOR_sched_op), "1" (SCHEDOP_block) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_shutdown( + void) +{ + int ret; + unsigned long ign1; + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1) + : "0" (__HYPERVISOR_sched_op), + "1" (SCHEDOP_shutdown | (SHUTDOWN_poweroff << SCHEDOP_reasonshift)) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_reboot( + void) +{ + int ret; + unsigned long ign1; + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1) + : "0" (__HYPERVISOR_sched_op), + "1" (SCHEDOP_shutdown | (SHUTDOWN_reboot << SCHEDOP_reasonshift)) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_suspend( + unsigned long srec) +{ + int ret; + unsigned long ign1, ign2; + + /* NB. On suspend, control software expects a suspend record in %esi. */ + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=S" (ign2) + : "0" (__HYPERVISOR_sched_op), + "b" (SCHEDOP_shutdown | (SHUTDOWN_suspend << SCHEDOP_reasonshift)), + "S" (srec) : "memory"); + + return ret; +} + +static inline int +HYPERVISOR_crash( + void) +{ + int ret; + unsigned long ign1; + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1) + : "0" (__HYPERVISOR_sched_op), + "1" (SCHEDOP_shutdown | (SHUTDOWN_crash << SCHEDOP_reasonshift)) + : "memory" ); + + return ret; +} + +static inline long +HYPERVISOR_set_timer_op( + u64 timeout) +{ + int ret; + unsigned long timeout_hi = (unsigned long)(timeout>>32); + unsigned long timeout_lo = (unsigned long)timeout; + unsigned long ign1, ign2; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2) + : "0" (__HYPERVISOR_set_timer_op), "b" (timeout_lo), "c" (timeout_hi) + : "memory"); + + return ret; +} + +static inline int +HYPERVISOR_dom0_op( + dom0_op_t *dom0_op) +{ + int ret; + unsigned long ign1; + + dom0_op->interface_version = DOM0_INTERFACE_VERSION; + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1) + : "0" (__HYPERVISOR_dom0_op), "1" (dom0_op) + : "memory"); + + return ret; +} + +static inline int +HYPERVISOR_set_debugreg( + int reg, unsigned long value) +{ + int ret; + unsigned long ign1, ign2; + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2) + : "0" (__HYPERVISOR_set_debugreg), "1" (reg), "2" (value) + : "memory" ); + + return ret; +} + +static inline unsigned long +HYPERVISOR_get_debugreg( + int reg) +{ + unsigned long ret; + unsigned long ign; + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign) + : "0" (__HYPERVISOR_get_debugreg), "1" (reg) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_update_descriptor( + unsigned long ma, unsigned long word1, unsigned long word2) +{ + int ret; + unsigned long ign1, ign2, ign3; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) + : "0" (__HYPERVISOR_update_descriptor), "1" (ma), "2" (word1), + "3" (word2) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_set_fast_trap( + int idx) +{ + int ret; + unsigned long ign; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign) + : "0" (__HYPERVISOR_set_fast_trap), "1" (idx) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_dom_mem_op( + unsigned int op, unsigned long *extent_list, + unsigned long nr_extents, unsigned int extent_order) +{ + int ret; + unsigned long ign1, ign2, ign3, ign4, ign5; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4), + "=D" (ign5) + : "0" (__HYPERVISOR_dom_mem_op), "1" (op), "2" (extent_list), + "3" (nr_extents), "4" (extent_order), "5" (DOMID_SELF) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_multicall( + void *call_list, int nr_calls) +{ + int ret; + unsigned long ign1, ign2; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2) + : "0" (__HYPERVISOR_multicall), "1" (call_list), "2" (nr_calls) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_update_va_mapping( + unsigned long va, pte_t new_val, unsigned long flags) +{ + int ret; + unsigned long ign1, ign2, ign3; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) + : "0" (__HYPERVISOR_update_va_mapping), + "1" (va), "2" ((new_val).pte_low), "3" (flags) + : "memory" ); + + if ( unlikely(ret < 0) ) + { + printk(KERN_ALERT "Failed update VA mapping: %08lx, %08lx, %08lx\n", + va, (new_val).pte_low, flags); + BUG(); + } + + return ret; +} + +static inline int +HYPERVISOR_event_channel_op( + void *op) +{ + int ret; + unsigned long ignore; + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ignore) + : "0" (__HYPERVISOR_event_channel_op), "1" (op) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_xen_version( + int cmd) +{ + int ret; + unsigned long ignore; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ignore) + : "0" (__HYPERVISOR_xen_version), "1" (cmd) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_console_io( + int cmd, int count, char *str) +{ + int ret; + unsigned long ign1, ign2, ign3; + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) + : "0" (__HYPERVISOR_console_io), "1" (cmd), "2" (count), "3" (str) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_physdev_op( + void *physdev_op) +{ + int ret; + unsigned long ign; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign) + : "0" (__HYPERVISOR_physdev_op), "1" (physdev_op) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_grant_table_op( + unsigned int cmd, void *uop, unsigned int count) +{ + int ret; + unsigned long ign1, ign2, ign3; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) + : "0" (__HYPERVISOR_grant_table_op), "1" (cmd), "2" (uop), "3" (count) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_update_va_mapping_otherdomain( + unsigned long va, pte_t new_val, unsigned long flags, domid_t domid) +{ + int ret; + unsigned long ign1, ign2, ign3, ign4; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4) + : "0" (__HYPERVISOR_update_va_mapping_otherdomain), + "1" (va), "2" ((new_val).pte_low), "3" (flags), "4" (domid) : + "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_vm_assist( + unsigned int cmd, unsigned int type) +{ + int ret; + unsigned long ign1, ign2; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2) + : "0" (__HYPERVISOR_vm_assist), "1" (cmd), "2" (type) + : "memory" ); + + return ret; +} + +static inline int +HYPERVISOR_boot_vcpu( + unsigned long vcpu, full_execution_context_t *ctxt) +{ + int ret; + unsigned long ign1, ign2; + + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret), "=b" (ign1), "=c" (ign2) + : "0" (__HYPERVISOR_boot_vcpu), "1" (vcpu), "2" (ctxt) + : "memory"); + + return ret; +} + +#endif /* __HYPERCALL_H__ */ diff --git a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/desc.h b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/desc.h index 19a8108dfe..dcc51d667d 100644 --- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/desc.h +++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/desc.h @@ -71,7 +71,19 @@ extern struct desc_ptr cpu_gdt_table[NR_CPUS][GDT_ENTRIES]; #define load_TR_desc() asm volatile("ltr %w0"::"r" (GDT_ENTRY_TSS*8)) #define load_LDT_desc() asm volatile("lldt %w0"::"r" (GDT_ENTRY_LDT*8)) -#define clear_LDT() asm volatile("lldt %w0"::"r" (0)) + +static inline void clear_LDT(void) +{ + int cpu = get_cpu(); + + /* + * NB. We load the default_ldt for lcall7/27 handling on demand, as + * it slows down context switching. Noone uses it anyway. + */ + cpu = cpu; /* XXX avoid compiler warning */ + xen_set_ldt(0UL, 0); + put_cpu(); +} /* * This is the ldt that every process will get unless we need @@ -211,7 +223,7 @@ extern inline void load_LDT_nolock (mm_context_t *pc, int cpu) if (likely(!count)) segments = NULL; - queue_set_ldt((unsigned long)segments, count); + xen_set_ldt((unsigned long)segments, count); } static inline void load_LDT(mm_context_t *pc) diff --git a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/fixmap.h b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/fixmap.h index d71333847c..dbb7043961 100644 --- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/fixmap.h +++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/fixmap.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -46,7 +47,8 @@ enum fixed_addresses { FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1, #endif FIX_SHARED_INFO, - FIX_GNTTAB, + FIX_GNTTAB_BEGIN, + FIX_GNTTAB_END = FIX_GNTTAB_BEGIN + NR_GRANT_FRAMES - 1, #ifdef CONFIG_XEN_PHYSDEV_ACCESS #define NR_FIX_ISAMAPS 256 FIX_ISAMAP_END, diff --git a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/hypercall.h b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/hypercall.h index 2055b32c02..237d77ac83 100644 --- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/hypercall.h +++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/hypercall.h @@ -59,16 +59,32 @@ HYPERVISOR_set_trap_table( static inline int HYPERVISOR_mmu_update( - mmu_update_t *req, int count, int *success_count) + mmu_update_t *req, int count, int *success_count, domid_t domid) { int ret; __asm__ __volatile__ ( - TRAP_INSTR + "movq %5, %%r10;" TRAP_INSTR : "=a" (ret) : "0" ((unsigned long)__HYPERVISOR_mmu_update), "D" (req), "S" ((long)count), - "d" (success_count) - : __syscall_clobber ); + "d" (success_count), "g" ((unsigned long)domid) + : __syscall_clobber, "r10" ); + + return ret; +} + +static inline int +HYPERVISOR_mmuext_op( + struct mmuext_op *op, int count, int *success_count, domid_t domid) +{ + int ret; + + __asm__ __volatile__ ( + "movq %5, %%r10;" TRAP_INSTR + : "=a" (ret) + : "0" (__HYPERVISOR_mmuext_op), "D" (op), "S" ((long)count), + "d" (success_count), "g" ((unsigned long)domid) + : __syscall_clobber, "r10" ); return ret; } @@ -223,7 +239,8 @@ HYPERVISOR_set_timer_op( __asm__ __volatile__ ( TRAP_INSTR : "=a" (ret) - : "0" ((unsigned long)__HYPERVISOR_set_timer_op), "D" (timeout) + : "0" ((unsigned long)__HYPERVISOR_set_timer_op), + "D" (timeout) : __syscall_clobber ); return ret; @@ -284,7 +301,8 @@ HYPERVISOR_update_descriptor( __asm__ __volatile__ ( TRAP_INSTR : "=a" (ret) - : "0" ((unsigned long)__HYPERVISOR_update_descriptor), "D" (ma), "S" (word) + : "0" ((unsigned long)__HYPERVISOR_update_descriptor), "D" (ma), + "S" (word) : __syscall_clobber ); return ret; diff --git a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/mmu_context.h b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/mmu_context.h index 6093f960b3..4e487a06d6 100644 --- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/mmu_context.h +++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/mmu_context.h @@ -71,7 +71,6 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, #define activate_mm(prev, next) do { \ switch_mm((prev),(next),NULL); \ - flush_page_update_queue(); \ } while (0) #endif diff --git a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/pgalloc.h b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/pgalloc.h index 5525562fbb..325d700c3b 100644 --- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/pgalloc.h +++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/pgalloc.h @@ -18,19 +18,16 @@ void make_pages_writable(void *va, unsigned int nr); static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte) { set_pmd(pmd, __pmd(_PAGE_TABLE | __pa(pte))); - flush_page_update_queue(); } static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *pte) { set_pmd(pmd, __pmd(_PAGE_TABLE | (page_to_pfn(pte) << PAGE_SHIFT))); - flush_page_update_queue(); } static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) { set_pud(pud, __pud(_PAGE_TABLE | __pa(pmd))); - flush_page_update_queue(); } /* @@ -41,7 +38,6 @@ static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud) { set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(pud))); set_pgd(__user_pgd(pgd), __pgd(_PAGE_TABLE | __pa(pud))); - flush_page_update_queue(); } extern __inline__ pmd_t *get_pmd(void) @@ -51,7 +47,6 @@ extern __inline__ pmd_t *get_pmd(void) return NULL; make_page_readonly(pmd); xen_pmd_pin(__pa(pmd)); - flush_page_update_queue(); return pmd; } @@ -60,7 +55,6 @@ extern __inline__ void pmd_free(pmd_t *pmd) BUG_ON((unsigned long)pmd & (PAGE_SIZE-1)); xen_pmd_unpin(__pa(pmd)); make_page_writable(pmd); - flush_page_update_queue(); free_page((unsigned long)pmd); } @@ -71,7 +65,6 @@ static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr) return NULL; make_page_readonly(pmd); xen_pmd_pin(__pa(pmd)); - flush_page_update_queue(); return pmd; } @@ -82,7 +75,6 @@ static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr) return NULL; make_page_readonly(pud); xen_pud_pin(__pa(pud)); - flush_page_update_queue(); return pud; } @@ -91,7 +83,6 @@ static inline void pud_free(pud_t *pud) BUG_ON((unsigned long)pud & (PAGE_SIZE-1)); xen_pud_unpin(__pa(pud)); make_page_writable(pud); - flush_page_update_queue(); free_page((unsigned long)pud); } @@ -126,7 +117,6 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm) */ set_pgd(__user_pgd(pgd) + pgd_index(VSYSCALL_START), mk_kernel_pgd(__pa_symbol(level3_user_pgt))); - flush_page_update_queue(); return pgd; } @@ -136,7 +126,6 @@ static inline void pgd_free(pgd_t *pgd) xen_pgd_unpin(__pa(pgd)); xen_pgd_unpin(__pa(__user_pgd(pgd))); make_pages_writable(pgd, 2); - flush_page_update_queue(); free_pages((unsigned long)pgd, 1); } @@ -147,7 +136,6 @@ static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long ad return NULL; make_page_readonly(pte); xen_pte_pin(__pa(pte)); - flush_page_update_queue(); return pte; } @@ -158,7 +146,6 @@ static inline struct page *pte_alloc_one(struct mm_struct *mm, unsigned long add return NULL; make_page_readonly(pte); xen_pte_pin(__pa(pte)); - flush_page_update_queue(); return virt_to_page((unsigned long)pte); } @@ -170,7 +157,6 @@ extern __inline__ void pte_free_kernel(pte_t *pte) BUG_ON((unsigned long)pte & (PAGE_SIZE-1)); xen_pte_unpin(__pa(pte)); make_page_writable(pte); - flush_page_update_queue(); free_page((unsigned long)pte); } diff --git a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h index 617cb6256f..5010b3d2c6 100644 --- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h +++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h @@ -91,9 +91,9 @@ static inline void set_pte(pte_t *dst, pte_t val) #endif #endif -#define set_pmd(pmdptr, pmdval) xen_l2_entry_update(pmdptr, (pmdval).pmd) -#define set_pud(pudptr, pudval) xen_l3_entry_update(pudptr, (pudval).pud) -#define set_pgd(pgdptr, pgdval) xen_l4_entry_update(pgdptr, (pgdval).pgd) +#define set_pmd(pmdptr, pmdval) xen_l2_entry_update(pmdptr, (pmdval)) +#define set_pud(pudptr, pudval) xen_l3_entry_update(pudptr, (pudval)) +#define set_pgd(pgdptr, pgdval) xen_l4_entry_update(pgdptr, (pgdval)) extern inline void pud_clear (pud_t * pud) { diff --git a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/system.h b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/system.h index 518beb6e39..bffa9208c8 100644 --- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/system.h +++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-x86_64/system.h @@ -54,9 +54,6 @@ extern void load_gs_index(unsigned); -#define __load_gs_index(index) \ - HYPERVISOR_set_segment_base(SEGBASE_GS_USER_SEL, index) - /* * Load a segment. Fall back on loading the zero * segment if something goes wrong.. @@ -176,13 +173,8 @@ static inline void write_cr4(unsigned long val) #define stts() write_cr0(8 | read_cr0()) -static inline void wbinvd(void) -{ - mmu_update_t u; - u.ptr = MMU_EXTENDED_COMMAND; - u.val = MMUEXT_FLUSH_CACHE; - (void)HYPERVISOR_mmu_update(&u, 1, NULL); -} +#define wbinvd() \ + __asm__ __volatile__ ("wbinvd": : :"memory"); #endif /* __KERNEL__ */ diff --git a/linux-2.6.11-xen-sparse/include/asm-xen/hypervisor.h b/linux-2.6.11-xen-sparse/include/asm-xen/hypervisor.h index 116e0df853..df713aa9ea 100644 --- a/linux-2.6.11-xen-sparse/include/asm-xen/hypervisor.h +++ b/linux-2.6.11-xen-sparse/include/asm-xen/hypervisor.h @@ -39,9 +39,11 @@ #include #include #include +#if defined(__i386__) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) #include #endif +#endif /* arch/xen/i386/kernel/setup.c */ union xen_start_info_union @@ -73,11 +75,19 @@ void lgdt_finish(void); void xen_l1_entry_update(pte_t *ptr, unsigned long val); void xen_l2_entry_update(pmd_t *ptr, pmd_t val); +void xen_l3_entry_update(pud_t *ptr, pud_t val); /* x86_64 only */ +void xen_l4_entry_update(pgd_t *ptr, pgd_t val); /* x86_64 only */ void xen_pt_switch(unsigned long ptr); +void xen_new_user_pt(unsigned long ptr); /* x86_64 only */ +void xen_load_gs(unsigned int selector); /* x86_64 only */ void xen_tlb_flush(void); void xen_invlpg(unsigned long ptr); void xen_pgd_pin(unsigned long ptr); void xen_pgd_unpin(unsigned long ptr); +void xen_pud_pin(unsigned long ptr); /* x86_64 only */ +void xen_pud_unpin(unsigned long ptr); /* x86_64 only */ +void xen_pmd_pin(unsigned long ptr); /* x86_64 only */ +void xen_pmd_unpin(unsigned long ptr); /* x86_64 only */ void xen_pte_pin(unsigned long ptr); void xen_pte_unpin(unsigned long ptr); void xen_set_ldt(unsigned long ptr, unsigned long bytes); @@ -112,506 +122,6 @@ void xen_invlpg_mask(cpumask_t mask, unsigned long ptr); unsigned long allocate_empty_lowmem_region(unsigned long pages); #endif -/* - * Assembler stubs for hyper-calls. - */ - -static inline int -HYPERVISOR_set_trap_table( - trap_info_t *table) -{ - int ret; - unsigned long ignore; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ignore) - : "0" (__HYPERVISOR_set_trap_table), "1" (table) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_mmu_update( - mmu_update_t *req, int count, int *success_count, domid_t domid) -{ - int ret; - unsigned long ign1, ign2, ign3, ign4; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4) - : "0" (__HYPERVISOR_mmu_update), "1" (req), "2" (count), - "3" (success_count), "4" (domid) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_mmuext_op( - struct mmuext_op *op, int count, int *success_count, domid_t domid) -{ - int ret; - unsigned long ign1, ign2, ign3, ign4; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4) - : "0" (__HYPERVISOR_mmuext_op), "1" (op), "2" (count), - "3" (success_count), "4" (domid) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_set_gdt( - unsigned long *frame_list, int entries) -{ - int ret; - unsigned long ign1, ign2; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2) - : "0" (__HYPERVISOR_set_gdt), "1" (frame_list), "2" (entries) - : "memory" ); - - - return ret; -} - -static inline int -HYPERVISOR_stack_switch( - unsigned long ss, unsigned long esp) -{ - int ret; - unsigned long ign1, ign2; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2) - : "0" (__HYPERVISOR_stack_switch), "1" (ss), "2" (esp) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_set_callbacks( - unsigned long event_selector, unsigned long event_address, - unsigned long failsafe_selector, unsigned long failsafe_address) -{ - int ret; - unsigned long ign1, ign2, ign3, ign4; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4) - : "0" (__HYPERVISOR_set_callbacks), "1" (event_selector), - "2" (event_address), "3" (failsafe_selector), "4" (failsafe_address) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_fpu_taskswitch( - int set) -{ - int ret; - unsigned long ign; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign) - : "0" (__HYPERVISOR_fpu_taskswitch), "1" (set) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_yield( - void) -{ - int ret; - unsigned long ign; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign) - : "0" (__HYPERVISOR_sched_op), "1" (SCHEDOP_yield) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_block( - void) -{ - int ret; - unsigned long ign1; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1) - : "0" (__HYPERVISOR_sched_op), "1" (SCHEDOP_block) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_shutdown( - void) -{ - int ret; - unsigned long ign1; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1) - : "0" (__HYPERVISOR_sched_op), - "1" (SCHEDOP_shutdown | (SHUTDOWN_poweroff << SCHEDOP_reasonshift)) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_reboot( - void) -{ - int ret; - unsigned long ign1; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1) - : "0" (__HYPERVISOR_sched_op), - "1" (SCHEDOP_shutdown | (SHUTDOWN_reboot << SCHEDOP_reasonshift)) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_suspend( - unsigned long srec) -{ - int ret; - unsigned long ign1, ign2; - - /* NB. On suspend, control software expects a suspend record in %esi. */ - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=S" (ign2) - : "0" (__HYPERVISOR_sched_op), - "b" (SCHEDOP_shutdown | (SHUTDOWN_suspend << SCHEDOP_reasonshift)), - "S" (srec) : "memory"); - - return ret; -} - -static inline int -HYPERVISOR_crash( - void) -{ - int ret; - unsigned long ign1; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1) - : "0" (__HYPERVISOR_sched_op), - "1" (SCHEDOP_shutdown | (SHUTDOWN_crash << SCHEDOP_reasonshift)) - : "memory" ); - - return ret; -} - -static inline long -HYPERVISOR_set_timer_op( - u64 timeout) -{ - int ret; - unsigned long timeout_hi = (unsigned long)(timeout>>32); - unsigned long timeout_lo = (unsigned long)timeout; - unsigned long ign1, ign2; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2) - : "0" (__HYPERVISOR_set_timer_op), "b" (timeout_lo), "c" (timeout_hi) - : "memory"); - - return ret; -} - -static inline int -HYPERVISOR_dom0_op( - dom0_op_t *dom0_op) -{ - int ret; - unsigned long ign1; - - dom0_op->interface_version = DOM0_INTERFACE_VERSION; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1) - : "0" (__HYPERVISOR_dom0_op), "1" (dom0_op) - : "memory"); - - return ret; -} - -static inline int -HYPERVISOR_set_debugreg( - int reg, unsigned long value) -{ - int ret; - unsigned long ign1, ign2; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2) - : "0" (__HYPERVISOR_set_debugreg), "1" (reg), "2" (value) - : "memory" ); - - return ret; -} - -static inline unsigned long -HYPERVISOR_get_debugreg( - int reg) -{ - unsigned long ret; - unsigned long ign; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign) - : "0" (__HYPERVISOR_get_debugreg), "1" (reg) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_update_descriptor( - unsigned long ma, unsigned long word1, unsigned long word2) -{ - int ret; - unsigned long ign1, ign2, ign3; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) - : "0" (__HYPERVISOR_update_descriptor), "1" (ma), "2" (word1), - "3" (word2) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_set_fast_trap( - int idx) -{ - int ret; - unsigned long ign; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign) - : "0" (__HYPERVISOR_set_fast_trap), "1" (idx) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_dom_mem_op( - unsigned int op, unsigned long *extent_list, - unsigned long nr_extents, unsigned int extent_order) -{ - int ret; - unsigned long ign1, ign2, ign3, ign4, ign5; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4), - "=D" (ign5) - : "0" (__HYPERVISOR_dom_mem_op), "1" (op), "2" (extent_list), - "3" (nr_extents), "4" (extent_order), "5" (DOMID_SELF) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_multicall( - void *call_list, int nr_calls) -{ - int ret; - unsigned long ign1, ign2; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2) - : "0" (__HYPERVISOR_multicall), "1" (call_list), "2" (nr_calls) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_update_va_mapping( - unsigned long va, pte_t new_val, unsigned long flags) -{ - int ret; - unsigned long ign1, ign2, ign3; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) - : "0" (__HYPERVISOR_update_va_mapping), - "1" (va), "2" ((new_val).pte_low), "3" (flags) - : "memory" ); - - if ( unlikely(ret < 0) ) - { - printk(KERN_ALERT "Failed update VA mapping: %08lx, %08lx, %08lx\n", - va, (new_val).pte_low, flags); - BUG(); - } - - return ret; -} - -static inline int -HYPERVISOR_event_channel_op( - void *op) -{ - int ret; - unsigned long ignore; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ignore) - : "0" (__HYPERVISOR_event_channel_op), "1" (op) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_xen_version( - int cmd) -{ - int ret; - unsigned long ignore; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ignore) - : "0" (__HYPERVISOR_xen_version), "1" (cmd) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_console_io( - int cmd, int count, char *str) -{ - int ret; - unsigned long ign1, ign2, ign3; - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) - : "0" (__HYPERVISOR_console_io), "1" (cmd), "2" (count), "3" (str) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_physdev_op( - void *physdev_op) -{ - int ret; - unsigned long ign; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign) - : "0" (__HYPERVISOR_physdev_op), "1" (physdev_op) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_grant_table_op( - unsigned int cmd, void *uop, unsigned int count) -{ - int ret; - unsigned long ign1, ign2, ign3; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) - : "0" (__HYPERVISOR_grant_table_op), "1" (cmd), "2" (uop), "3" (count) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_update_va_mapping_otherdomain( - unsigned long va, pte_t new_val, unsigned long flags, domid_t domid) -{ - int ret; - unsigned long ign1, ign2, ign3, ign4; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4) - : "0" (__HYPERVISOR_update_va_mapping_otherdomain), - "1" (va), "2" ((new_val).pte_low), "3" (flags), "4" (domid) : - "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_vm_assist( - unsigned int cmd, unsigned int type) -{ - int ret; - unsigned long ign1, ign2; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2) - : "0" (__HYPERVISOR_vm_assist), "1" (cmd), "2" (type) - : "memory" ); - - return ret; -} - -static inline int -HYPERVISOR_boot_vcpu( - unsigned long vcpu, full_execution_context_t *ctxt) -{ - int ret; - unsigned long ign1, ign2; - - __asm__ __volatile__ ( - TRAP_INSTR - : "=a" (ret), "=b" (ign1), "=c" (ign2) - : "0" (__HYPERVISOR_boot_vcpu), "1" (vcpu), "2" (ctxt) - : "memory"); - - return ret; -} +#include #endif /* __HYPERVISOR_H__ */ -- 2.30.2